2010-08-15 24 views
17

Bạn sẽ liệt kê ra các mô-đun đã được bao gồm trong một lớp cụ thể trong phân cấp lớp trong Ruby như thế nào? Một cái gì đó như thế này:Làm cách nào để liệt kê các Mô-đun trong Lớp học Ruby?

module SomeModule 
end 

class ParentModel < Object 
    include SomeModule 
end 

class ChildModel < ParentModel 
end 

p ChildModel.included_modules #=> [SomeModule] 
p ChildModel.included_modules(false) #=> [] 

Niêm yết tổ tiên làm cho các mô-đun xuất hiện cao hơn trong cây:

p ChildModel.ancestors #=> [ChildModel, ParentModel, SomeModule, Object, Kernel] 

Trả lời

16

Theo như tôi hiểu câu hỏi của bạn, một cái gì đó như thế này là những gì bạn đang tìm kiếm:

class Class 
    def mixin_ancestors(include_ancestors=true) 
    ancestors.take_while {|a| include_ancestors || a != superclass }. 
    select {|ancestor| ancestor.instance_of?(Module) } 
    end 
end 

Tuy nhiên, tôi không hiểu đầy đủ testcases của bạn: tại sao là SomeModule được liệt kê là mô-đun đi kèm của ChildModel mặc dù nó không phải là thực sự được bao gồm trong ChildModel nhưng trong ParentModel? Và ngược lại, tại sao là Kernelkhông phải được liệt kê dưới dạng mô-đun đi kèm, mặc dù nó chỉ là nhiều trong chuỗi tổ tiên là SomeModule? Và đối số boolean cho phương thức có ý nghĩa gì?

(Lưu ý rằng đối số boolean là luôn thiết kế xấu:. Một phương pháp cần thực hiện chính xác một điều Nếu phải mất một đối số boolean, nó theo định nghĩa hai điều, một nếu đối số là đúng, khác là đối số là sai. Hoặc, nếu nó chỉ có một điều, thì điều này chỉ có thể có nghĩa là nó bỏ qua đối số của nó, trong trường hợp đó nó không nên bắt đầu.)

+0

Tôi không phải là poster gốc, nhưng Tôi nghĩ rằng tôi có thể trả lời câu hỏi của bạn lại: đối số boolean. Lance đang mong đợi phương thức '.included_modules' này hoạt động như' # methods', '# public_methods' và các phương thức tương tự khác làm trong Ruby. Trên đó, một giá trị 'true' có nghĩa là" chỉ cho tôi các phương thức mà đối tượng này nhận được từ lớp của nó Ở BỔ SUNG CHO những cái mà nó nhận được từ các lớp tổ tiên của nó và các mô-đun bao gồm ". Giá trị sai không trả lại các phương thức bổ sung này. – pablobm

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