Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
关于Ruby singleton类的一般问题_Ruby_Singleton - Fatal编程技术网

关于Ruby singleton类的一般问题

关于Ruby singleton类的一般问题,ruby,singleton,Ruby,Singleton,include ModuleName将模块中的方法作为实例方法添加到include类 所以如果你写 X = MyClass.new X.my_method 然后my_方法成为MyClass上的实例方法,例如 当您将模块包含在singleton类中时,这些方法仍将作为实例方法添加到类的实例中。因此,它们在MyClass上显示为类方法 编辑Jörg W Mittag:但是,您永远不应该这样做,因为在singleton类中包含与扩展原始对象相同,这是首选的。那么这个, m = MyClass.new

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

所以如果你写

X = MyClass.new
X.my_method
然后my_方法成为MyClass上的实例方法,例如

当您将模块包含在singleton类中时,这些方法仍将作为实例方法添加到类的实例中。因此,它们在MyClass上显示为类方法

编辑Jörg W Mittag:但是,您永远不应该这样做,因为在singleton类中包含与扩展原始对象相同,这是首选的。那么这个,

m = MyClass.new
m.my_method # => "hello"
你应该始终使用后一种形式

更一般地说,这是:

class MyClass
  extend MyModule
end
编辑MAL:如果您希望将方法同时作为实例方法和方法,您可以简单地按照上述方式定义方法,并扩展self,这将使模块对象本身可以访问所有实例方法,或者也可以使用module_函数:my_方法。

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

所以如果你写

X = MyClass.new
X.my_method
然后my_方法成为MyClass上的实例方法,例如

当您将模块包含在singleton类中时,这些方法仍将作为实例方法添加到类的实例中。因此,它们在MyClass上显示为类方法

编辑Jörg W Mittag:但是,您永远不应该这样做,因为在singleton类中包含与扩展原始对象相同,这是首选的。那么这个,

m = MyClass.new
m.my_method # => "hello"
你应该始终使用后一种形式

更一般地说,这是:

class MyClass
  extend MyModule
end

编辑MAL:如果您想将您的方法同时作为实例方法和方法,您可以简单地按照上述方式定义您的方法,或者扩展self,使模块对象本身可以访问所有实例方法,或者使用模块函数:我的方法。

您的问题已经涵盖了所有基础,因此,我添加了我的评论作为编辑,而不是单独的答案。@Jörg感谢您这么做-我也一直使用扩展自己,所以直到Dex的问题出现之前,我才真正考虑将其包含在singleton类中。我自由地编辑了答案,使用术语singleton类,因为它是官方名称。事实上,Ruby 1.9.2引入了Objectsingleton_classI复制了Jörg并编辑了您的答案以提及模块_函数。您的问题已经涵盖了所有基础,因此,我添加了我的评论作为编辑,而不是单独的答案。@Jörg感谢您这么做-我也一直使用扩展自己,所以直到Dex的问题出现之前,我才真正考虑将其包含在singleton类中。我自由地编辑了答案,使用术语singleton类,因为它是官方名称。事实上,Ruby 1.9.2引入了Objectsingleton_classI复制了Jörg并编辑了您的答案以提及模块_函数。我冒昧地编辑了这个问题,使用了术语singleton类,因为它是官方名称。事实上,Ruby 1.9.2引入了Objectsingleton_classI,我冒昧地编辑了这个问题,使用了术语singleton类,因为它是官方名称。实际上,Ruby 1.9.2引入了Objectsingleton_类
foo = Object.new
class << foo
  include MyModule
end
foo = Object.new
foo.extend MyModule