2014-03-19 3 views
0

루비에서는 '하위'모듈이 '상위'모듈의 속성을 상속하는 올바른 방법은 무엇입니까? 하나의 모듈에 속성을 정의한 다음 해당 모듈을 확장하고 하위 모듈을 클래스에 혼합하면 하위 모듈에서 속성에 액세스 할 수 있어야합니다. 그러나 행운을 얻지 못하는 것 같습니다 ...다른 모듈의 모듈 attr_accessor

module A 
    attr_accessor :foo 
end 

module B 
    extend A 

    def not_worky 
    p "#{foo}" 
    end 
end 

class C 
    include B 
end 

class D 
    include A 
end 

irb(main):027:0* d = D.new 
irb(main):028:0> d.foo=> nil 

irb(main):033:0* c = C.new 
irb(main):034:0> c.foo 
    NoMethodError: undefined method `foo' for #<C:0x553853eb> 
irb(main):038:0> c.not_worky 
    NameError: undefined local variable or method `foo' for #<C:0x553853eb> 

답변

0

include은 인스턴스 메소드를 추가하고, extends은 클래스 메소드를 추가하기위한 것입니다. 이

B.foo #=> nil 

here 그리고 이것은 내가 할 노력했다 내 자신의 잘못된 이해 때문 here

0

을 읽을처럼 그래서 당신은 할 수 있습니다. 단순히 표준 포함 메커니즘을 사용하면 예상대로 작동합니다. 보다 현실적인 예 ...

module App 
    attr_accessor :log 
    def initialize 
    self.log = 'meh' 
    end 
end 

module DB 
    include App 
    def go 
    p log 
    end 
end 

class Foo 
    include DB 
end 

irb(main):002:0> f = Foo.new 
     => #<Foo:0x7cece08c @log="meh"> 
irb(main):003:0> f.go 
"meh" 
관련 문제