ruby中的singleton类是什么?

看起来好像我错过了这个观点,或者误解了Ruby中单例类的重要性。 我从很多方面听过和读过这些东西 – 比其他东西更复杂一些 – 但我对它是什么感到困惑。 它本身是一个阶级吗? 这是所有物体属于“阶级”的原因吗? 这个概念是模糊的 ,但是我相信它跟我为什么可以定义一个类方法(class foo; def foo.bar …)有关系。

那么:Ruby中的单例类是什么?

首先是一个小的定义: 单例方法是一个仅为单个对象定义的方法。 例:

irb(main):001:0> class Foo; def method1; puts 1; end; end => nil irb(main):002:0> foo = Foo.new => #<Foo:0xb79fa724> irb(main):003:0> def foo.method2; puts 2; end => nil irb(main):004:0> foo.method1 1 => nil irb(main):005:0> foo.method2 2 => nil irb(main):006:0> other_foo = Foo.new => #<Foo:0xb79f0ef4> irb(main):007:0> other_foo.method1 1 => nil irb(main):008:0> other_foo.method2 NoMethodError: undefined method `method2' for #<Foo:0xb79f0ef4> from (irb):8 

实例方法是类的方法(即在类的定义中定义的)。 类方法是Class实例上的单例方法 – 它们没有在类的定义中定义。 相反,它们是在对象的单例类上定义的。

 irb(main):009:0> Foo.method_defined? :method1 => true irb(main):010:0> Foo.method_defined? :method2 => false 

您可以使用语法class << obj打开对象的单例类。 在这里,我们看到这个单例类是单例方法定义的地方:

 irb(main):012:0> singleton_class = ( class << foo; self; end ) => #<Class:#<Foo:0xb79fa724>> irb(main):013:0> singleton_class.method_defined? :method1 => true irb(main):014:0> singleton_class.method_defined? :method2 => true irb(main):015:0> other_singleton_class = ( class << other_foo; self; end ) => #<Class:#<Foo:0xb79f0ef4>> irb(main):016:0> other_singleton_class.method_defined? :method1 => true irb(main):017:0> other_singleton_class.method_defined? :method2 => false 

因此,将单例方法添加到对象的另一种方法是使用打开的对象的单例类来定义它们:

 irb(main):018:0> class << foo; def method3; puts 3; end; end => nil irb(main):019:0> foo.method3 3 => nil irb(main):022:0> Foo.method_defined? :method3 => false 

综上所述:

  • 方法必须总是属于一个类(或者:是一些类的实例方法)
  • 普通方法属于它们定义的类(即类的实例方法)
  • 类方法只是一个Class单例方法
  • 对象的单例方法不是对象类的实例方法; 相反,它们是对象的单例类的实例方法。

Ruby提供了一种方法来定义特定于特定对象的方法,这种方法被称为Singleton方法。 当一个对象声明一个singleton方法时,Ruby会自动创build一个只包含单例方法的类。 新创build的类被称为Singleton类。

 foo = Array.new def foo.size "Hello World!" end foo.size # => "Hello World!" foo.class # => Array #Create another instance of Array Class and call size method on it bar = Array.new bar.size # => 0 

Singleton类是自动创build并插入到inheritance层次结构中的特定于对象的匿名类。

可以在对象上调用singleton_methods以获取对象上所有单例方法的名称列表。

  foo.singleton_methods # => [:size] bar.singleton_methods # => [] 

这篇文章确实帮助我理解了Ruby中的Singleton类,它有一个很好的代码示例。

最实用/最实际的方式来思考它(恕我直言)是:作为一个inheritance链,或方法查找/解决顺序。 这张照片可能有帮助

http://www.klankboomklang.com/2007/11/25/modules-part-i-enter-the-include-class/

这是1.9,对比内置和用户定义的类:我仍然消化这一个。

http://d.hatena.ne.jp/sumim/20080111/p1

另外,我还有一个令人困惑的用法,那就是“Singleton对象”,这是不同的概念。 一个单例对象来自一个类,它的构造函数/实例化方法被覆盖,所以你可以只分配一个类。

只是更新到@Pistos的答案,从版本1.9.2 ruby​​添加新的语法来获取单身人士class

  singleton_class = ( class << foo; self; end ) 

可以replace为:

 singleton_class = foo.singleton_class 

https://apidock.com/ruby/Object/singleton_class