include ModuleName
增加了从模块方法为例如方法到包括类。
所以,如果你写
class MyClass
include MyModule
end
然后my_method
成为上MyClass
例如实例方法
m = MyClass.new
m.my_method # => "hello"
当包括方法仍然被添加为实例方法,但对类Class
您的类的实例单身类中的模块。因此它们在MyClass
上显示为类方法。编辑(JörgW Mittag):但是,你永远不应该那样做,因为在单例类中including
与原始对象extending
相同,这是首选。所以,这样的:
class MyClass
class << self
include MyModule
end
end
是一样的:
class MyClass
extend MyModule
end
你应该总是使用后一种形式。
更普遍的做法是:
foo = Object.new
class << foo
include MyModule
end
是一样的:
foo = Object.new
foo.extend MyModule
EDIT(MAL):如果你想有你的方法既作为实例方法和方法,您可以简单地定义上述方法,并且可以使用extend self
这将使模块对象本身可以访问所有实例方法,也可以使用module_function :my_method
。
我冒昧地编辑这个问题使用术语'singleton class',因为它是正式名称。事实上,Ruby 1.9.2引入了'Object#singleton_class' – 2010-06-18 15:16:02