2011-10-17 36 views
12

Tôi là một chút nhầm lẫn về hành vi này từ ruby ​​(1.9) phiên dịchcó được phương pháp của một đối tượng trong ruby ​​

class Foo 
    def pub 
    private_thing 
    end 

    private 
    def private_thing 
    puts "private touch" 
    end 
end 



x = Foo.new 
x.pub 
private touch 
=> nil 

cho đến nay rất tốt.

x.private_thing 
NoMethodError: private method `private_thing' called for #<Foo:0xb76abd34> 
from (irb):25 
from :0 

vẫn ổn. đó là những gì tôi mong đợi

nhưng tại sao điều này trống?

x.methods(false) 
=> [] 

trong khi điều này mang lại cho tôi những gì tôi mong đợi?

Foo.instance_methods(false) 
=> ["pub"] 

Trả lời

7

Thật vậy, phương pháp "phương pháp" dường như đã biến mất. Bạn nên sử dụng public_instance_methods để thay thế.

Để giải thích lý do tại sao x.methods(false) hoạt động theo cách đó, hãy xem lại tài liệu ruby ​​1.9.1 http://www.ruby-doc.org/core-1.9.1/Object.html#method-i-methods. Nếu bạn thấy mã nguồn nếu bạn truyền vào một tham số, nó hoạt động như singleton_methods, đó là những gì bạn đang nắm bắt.

1

Dường như không có tài liệu nào về các phương pháp Object # ngoài ruby ​​1.9.1. Như thể nó không còn tồn tại nữa. (Hãy xem http://www.ruby-doc.org/core-1.9.3/Object.html)

Tôi cho rằng điều này là để làm rõ rằng người ta nên sử dụng một trong các .singleton_methods hoặc .instance_methods để xác định nơi phương thức sống.

Trong mọi trường hợp, một phương pháp không có giấy tờ có thể làm bất cứ điều gì nó thích.

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