关于Ruby单例类的一般问题

时间:2010-06-18 07:48:46

标签: ruby singleton

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

1 个答案:

答案 0 :(得分:6)

include ModuleName将模块中的方法作为实例方法添加到包含类中。

所以,如果你写

class MyClass
  include MyModule
end

然后my_method成为MyClass上的实例方法,例如

m = MyClass.new
m.my_method # => "hello"

当您在单例类中包含模块时,方法仍然作为实例方法添加,但是添加到类的类Class的实例中。因此,它们在MyClass上显示为类方法。

编辑(JörgWMittag):但是,你永远不应该这样做,因为单例类中的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