你就近了。您可能注意到實例方法正常工作。類方法的問題在於它定義時爲self => Foo
,所以它不響應Bar
。如果您在self.class_method
添加一行puts "I'm a module method"
,你會發現
Foo.class_method => "I'm a module method"
下面就來完成你想要做什麼的簡單方法:
module Foo_class
attr_accessor :cat
def class_method
puts "I'm a class method"
end
end
module Foo_instance
def instance_method
puts "I'm an instance method"
end
end
class Bar
extend Foo_class
include Foo_instance
end
Bar.class_method #=> I'm a class method
Bar.cat = "meow"
Bar.cat #=> "meow"
Bar.new.instance_method #=> I'm an instance method
我添加了一個類的實例變量,@cat
和訪問爲了它,只是爲了表明這是多麼容易。
Object#extend是偉大的,因爲你可以只添加實例變量和方法的模塊,就像你與Object#include到的mixin實例變量和方法做了,extend
混合並將其作爲類的實例變量和類方法。你也可以這樣做:
bar = Bar.new
bar.extend Foo_class
有實例變量和方法Foo_class
適用於實例bar
。
感謝關於將包含的模塊拆分爲多個部分的注意事項。我也在想這個。 –