Foo
如何返回@baz
的值。目前@baz
返回nil
。
module Bar
@baz = 'baz'
def get_baz
@baz
end
end
class Foo
extend Bar
end
Foo.get_baz # Currently returns nil
如果这不可能,有没有更好的方法来实现这个逻辑?
答案 0 :(得分:6)
试试这个:
module Bar
attr_accessor :baz
def get_baz
@baz
end
end
class Foo
extend Bar
end
Foo.baz = 'baz'
Foo.get_baz # => 'baz'
Foo.baz # => 'baz'
如果我们看一下Foo
的类方法,那当然可以:
Foo.singleton_methods # => [:get_baz, :baz, :baz=]
让我们稍微徘徊(module Bar
不变):
class Foo
extend Bar
include Bar
end
foo = Foo.new
foo.methods.sort # => [:!,..., :baz, :baz=,..., :get_baz,...]
Foo.baz = 'baz'
foo.baz = 'cat'
Foo.baz # => "baz"
Foo.baz = 'dog'
foo.baz # => "cat"
goo = Foo.new
goo.baz = 'squid'
goo.baz # => 'squid'
我们可以使用extend
为Bar
的特定实例引入Foo
方法:
class Foo
extend Bar
end
foo = Foo.new
foo.extend Bar
goo = Foo.new
我们使用Foo
和foo
获得与上述相同的结果,但
goo.baz = 'rhino' # => # NoMethodError: undefined method 'baz='
无法保持extend
和include
直线?也许这会有所帮助:类定义中的extend Bar
等同于Foo.singleton_class.send(:include, Bar)
。