2010-08-15 4 views
17

Ruby의 클래스 계층 구조에서 특정 클래스에 포함 된 모듈을 어떻게 나열 하시겠습니까? 이런 식으로 뭔가 :Ruby 클래스에 포함 된 모듈을 어떻게 나열합니까?

module SomeModule 
end 

class ParentModel < Object 
    include SomeModule 
end 

class ChildModel < ParentModel 
end 

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

조상 목록이 모듈은 트리에서 높은 보이게 : 지금까지 내가 당신의 질문을 이해

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

답변

16

,이 같은 당신이 찾고있는 무엇 :

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

그러나 테스트 케이스를 완전히 이해하지 못했습니다 : SomeModuleChildModel의 포함 된 모듈로 표시되는 이유는 무엇입니까? 은 실제로 ChildModel에 포함 된이 아니지만 ParentModel에 포함되어 있습니까? 그리고 반대로 KernelSomeModule과 같이 조상 체인에 포함되어 있더라도이 포함 된 모듈로 나열되지 않은 이유는 무엇입니까? 그리고 메소드에 대한 부울 인수는 무엇을 의미합니까?

(부울 인수 항상 나쁜 디자인 참고 :. 방법은 정확히 하나의 일을해야한다는 부울 인수를 취하는 경우, 정의에 의해 가지, 인수가 true의 경우, 하나, 또 다른이입니다 않습니다 인수가 거짓이거나, 단 한 가지만 수행하면 인수가 무시된다는 의미 일 수 있습니다.이 경우 인수가 시작될 수 없습니다.

+0

원래 포스터가 아니지만 나는 당신의 질문에 대답 할 수 있다고 생각한다 : 부울 인수. Lance는이'.included_modules' 메소드가'# methods','# public_methods'와 비슷한 다른 메소드가 Ruby에서하는 것처럼 동작 할 것으로 기대하고 있습니다. 이것들에있어서, "참"값은 "이 객체가 그 클래스에서 얻은 메소드를 조상 클래스와 포함 된 모듈에서 얻은 메소드에 추가로 표시합니다"를 의미합니다. false 값은 이러한 추가 메소드를 리턴하지 않습니다. – pablobm

관련 문제