2012-11-05 33 views
11

Tôi muốn biết nếu tôi có thể buộc này xảy raPhương thức Ruby Unbound: Có thể buộc ràng buộc với các thể hiện của các lớp khác không?

class A 
    def bomb ; "bomb" ; end 
end 

class B ; end 

bomb = A.instance_method(:bomb) 

b = B.new 
bomb.bind(b) 

hiện nó ném TypeError lỗi: đối số ràng buộc phải là một ví dụ của A

Tôi tìm thấy điều này rất hạn chế liên quan đến những gì tôi có thể làm với những phương pháp không liên kết này, các khả năng có một chút hạn chế. Trong những trường hợp như thế này (và tôi không chỉ đề cập đến các chức năng không cần thiết) nó sẽ có ý nghĩa đúng không? Và một lỗi thực hiện sẽ có sufficed, Trong trường hợp tôi sẽ được xử lý các biến từ A mà không được nhân rộng trong B. Tôi thực sự muốn biết làm thế nào để lực lượng này ràng buộc.

+0

Something thú vị mà có thể: 'Object.instance_method (: to_s). .bind ("hello world") gọi # => "# "'. Tôi không nghĩ rằng nó có thể buộc các ràng buộc trong ví dụ của bạn mặc dù. –

+2

Có, đó là vì String kế thừa từ Object, và bạn có thể ràng buộc các method kiểu superclass với các cá thể lớp con của nó. Một ví dụ: lớp A; def t; "A"; kết thúc ; kết thúc ; lớp B ChuckE

+0

nếu 'A' sẽ là một 'mô-đun', thì có thể trong ruby ​​2 –

Trả lời

2

Bạn không thể liên kết thể hiện của một lớp với phương thức của một lớp khác. Trừ khi cá thể là đối tượng của lớp này hoặc các lớp con của nó.

Và điều này cũng hiển nhiên, chi tiết của một lớp không thể được chuyển sang thể hiện của lớp khác. Nó có thể bị ràng buộc chỉ với cá thể đó được ủy quyền mang thông tin đó là, thể hiện của lớp đó hoặc lớp con của nó.

Do đó, ruby ​​cũng duy trì đóng gói bằng phương pháp không ràng buộc của lớp cụ thể đối với cá thể của một lớp khác.

0

Phương thức và loại UnboundMethod mong đợi rằng mục tiêu liên kết phải là lớp con của lớp gốc mà bạn đã tham chiếu phương thức. Việc chuyển đổi phương thức thành proc sẽ loại bỏ ràng buộc lớp con, nhưng chỉ Phương thức đã thực hiện phương thức to_proc.

class A 
    def bomb ; "bomb" ; end 
end 

class B ; end 

bomb = A.new.method(:bomb) 

B.send(:define_method, :bomb_in_b, &bomb) #converting to proc 

b = B.new 
puts b.bomb_in_b 

Tested trong Ruby 2.2.3

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