2013-03-18 35 views
5

Hãy mở lớp Module và thêm một phương pháp để nó:Class, Module, eigenclasses của họ, và phương pháp tra cứu

class Module 
    def foo 
    puts "phew" 
    end 
end 

tôi có thể gọi phương pháp này bằng cách làm này,

Class.foo 

đó là điều dễ hiểu vì lớp học của ClassClass, có lớp bậc trên là Module. vì vậy nó có thể gọi các phương thức thể hiện được xác định trong Module.

relation between classes and modules

Bây giờ, phương pháp bar dưới đây được định nghĩa trên eigenclass Module 's:

class Module 
    def self.bar 
    puts "bar" 
    end 
end 

nhưng bây giờ

Class.bar 

cũng làm việc.

Ai đó có thể giải thích cho tôi cách Class có thể truy cập các phương pháp trong eigenclass của Module không?


Tôi nghĩ mình đã hiểu ngay bây giờ. Phương pháp tra cứu không hoạt động theo cách tôi đã giải thích trước đây. khi tôi làm Class.foo, phương pháp này được tìm kiếm trong eigenclass của Class và sau đó là siêu lớp của nó là Module 's eigenclass tất cả các cách tối đa BasicObject' s eigenclass tại thời điểm nó biến mình (như một con rắn ăn đuôi của nó) đối với phương thức trong Class (như Class là siêu lớp của số eigenclass BasicObject) và sau đó là siêu lớp Module, tại đó tìm phương thức.

Tương tự, khi tôi làm Class.bar, phương pháp được tìm kiếm trong eigenclass của Class và sau đó trong eigenclass của Module nơi tìm thấy nó.

Khi tôi làm

class Class 
    def check 
    puts "class instance method" 
    end 
end 

class Module 
    def self.check  
    puts "modules eigenclass method"  
    end  
    def check  
    puts "module instance method" 
    end  
end 

đoán wot là sản phẩm khi tôi làm:

Class.check 

Đây là sự hiểu biết hiện tại của tôi: current understanding

+0

Thảo luận liên quan Tôi thấy hữu ích: https: // stackoverflow.com/questions/13269271/why-a-modules-singleton-method-is-not-visible-in-downstream-eigenclasses-nơi –

Trả lời

0

Gần đây tôi đã viết một extensive tutorial xinh đẹp, bao gồm cả hành vi Ruby 2.0 mới.

Lưu ý: thuật ngữ được sử dụng trong Ruby là singleton_class, không phải eigenclass.

+0

Liên kết tại địa chỉ đó đã chết –

1

Có một tổng quan khá toàn diện về hành vi tra cứu phương pháp của Ruby khi Eigenclasses tham gia vào this blog post by Andrea Singh. Đáng chú ý, phần "Eigenclasses và Class Inheritance" gần cuối cùng chứa một sơ đồ tra cứu hữu ích để giải quyết các câu hỏi của bạn.

+0

Đây có phải là hiện tại của Ruby 2.2 không? –

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