来自另一个模块的模块attr_accessor

时间:2014-03-19 02:59:09

标签: ruby-on-rails ruby jruby

在Ruby中,'子'模块从'父'模块继承属性的正确方法是什么?似乎如果你在一个模块中定义一个属性,然后扩展该模块并将子模块混合到一个类,我应该能够从子模块访问该属性,但没有任何运气......

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>

2 个答案:

答案 0 :(得分:0)

include用于添加实例方法,extends用于添加类方法。所以你可以这样做

B.foo #=>  nil

了解更多herehere

答案 1 :(得分: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"