2009-10-22 23 views
5

Đêm qua, tôi đã suy nghĩ về những gì tôi nghĩ là các tính năng ngôn ngữ ruby ​​tiên tiến, cụ thể là Continuations (callcc) và Binding objects. Tôi có nghĩa là nâng cao bởi vì tôi có một nền tĩnh im lặng gõ (C#, Java, C + +), tôi phát hiện ruby ​​rất gần đây, vì vậy các tính năng ngôn ngữ không phải là rất quen thuộc với tôi.Sử dụng các đối tượng ràng buộc trong thế giới thực trong ruby ​​

Tôi tự hỏi điều gì có thể được sử dụng trong thế giới thực của các tính năng ngôn ngữ này. Theo kinh nghiệm của tôi, mọi thứ có thể được thực hiện với các ngôn ngữ được gõ tĩnh, nhưng đôi khi tôi đồng ý không thông minh lắm. Tôi nghĩ rằng tôi đã tìm ra vẻ đẹp/sự quan tâm của Continuation đọc bài viết hay đó từ Sam Ruby: http://www.intertwingly.net/blog/2005/04/13/Continuations-for-Curmudgeons

Tuy nhiên, tôi bị mất với đối tượng ràng buộc. Ai đó có thể cung cấp cho tôi một số ví dụ thực tế về một cái gì đó có thể được thực hiện thông minh với đối tượng Binding nhưng không thông minh lắm với các ngôn ngữ thiếu khái niệm Binding ruby? Tôi đã nghĩ đến việc khôi phục một số đối tượng về trạng thái ban đầu khi gặp sự cố trong quá trình chạy dài, nhưng tôi không chắc rằng điều này có thể được thực hiện với đối tượng Binding và tôi nghĩ rằng có thể được thực hiện khá thông minh bằng cách nhân bản các đối tượng trước đó việc xử lý và thay thế đối tượng đã sửa đổi bằng các bản sao của chúng khi có sự cố trong quá trình xử lý. Vì vậy, đây không phải là một ví dụ hợp lệ tôi nghĩ.

Cảm ơn trước sự giúp đỡ của bạn.

Trả lời

5

Tôi đã sử dụng các lớp liên kết để thực hiện một sửa lỗi hack.

class Array 
    def debug binding 
    each do |arg| 
     puts "arg = #{eval(arg, binding).inspect}" 
    end 
    end 
end 

Bạn có thể sử dụng để kiểm tra một danh sách các đoạn mã Ruby cùng với những gì từng đoạn mã lợi nhuận:

# .. some hairy code you want to debug ... 
['user','current_resource', 'user.owns?(current_resource)'].debug(binding) 

mà sẽ in

user = #<User id:1, username: 'joe', ... 
current_resource = #<Comment id:20, ... 
user.owns?(current_resource) = false 

Tôi thấy nó rất hữu ích cho gỡ lỗi nhanh chóng.

Tôi cần sử dụng đối tượng liên kết để nắm bắt phạm vi trong đó debug được gọi để nó có thể được sử dụng trong eval khi debug được chạy. Có lẽ có nhiều cách khác để thực hiện điều này nhưng việc sử dụng ràng buộc rất dễ dàng và nhanh chóng. Cũng có thể có những ví dụ tốt hơn về những đối tượng ràng buộc nào hữu ích cho ...

+0

Cảm ơn! Đúng rồi đó! Thực hiện một tính năng gỡ lỗi có vẻ là một trong những sử dụng của đối tượng Binding. Tôi tự hỏi liệu tính năng gỡ lỗi này đã được ghi nhận như một ví dụ về các ràng buộc trong cuốn sách cuốc hay không. Bạn có thể thấy việc sử dụng các đối tượng ràng buộc khác không? –

+0

@dhruv Điều này khá trơn tru. Tôi nghĩ rằng tôi sẽ thêm nó vào gói tiện ích của tôi, ngay bên cạnh putsv (đặt nếu tiết) vv ... Cảm ơn! – Ryanmt

8

đối tượng Ràng buộc này rất hữu ích khi bạn muốn đánh giá ERB templates.

+1

Bạn có thể giải thích thêm một chút không? Tôi không hiểu ý anh là gì. –

+2

@SylvainPrat: Phương thức kết quả ERB # có một đối tượng 'Binding'. Bạn có thể lấy nó thay vì chỉ sử dụng phương thức Kernel 'binding', được gọi trực tiếp như trong' my_template.result (binding) '- thực hiện mã Ruby trong khuôn mẫu với ngữ cảnh hiện tại) –

1

Hãy xem http://www.seaside.st/, đây là một khung ứng dụng web smalltalk. Nó sử dụng liên tục rộng rãi. Ví dụ thực tế tốt nhất về cách sử dụng nó, là CMS http://www.cmsbox.com/en/cms

+0

Cảm ơn câu trả lời, nhưng câu hỏi của tôi là nhiều hơn về đối tượng ràng buộc hơn là tiếp tục;) –

Các vấn đề liên quan