module MyModule
def my_method; 'hello'; end
end
class MyClass
class << self
include MyModule
end
end
MyClass.my_method # => "hello
我不确定为什么“包含MyModule”需要在单例类中才能使用MyClass进行调用。
为什么我不能去:
X = MyClass.new
X.my_method
答案 0 :(得分:6)
include ModuleName
将模块中的方法作为实例方法添加到包含类中。
所以,如果你写
class MyClass
include MyModule
end
然后my_method
成为MyClass
上的实例方法,例如
m = MyClass.new
m.my_method # => "hello"
当您在单例类中包含模块时,方法仍然作为实例方法添加,但是添加到类的类Class
的实例中。因此,它们在MyClass
上显示为类方法。
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
。