怎么能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
如果这是不可能的,有没有更好的方法来实现这个逻辑?
怎么能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
如果这是不可能的,有没有更好的方法来实现这个逻辑?
尝试这个:
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)
.