什么是类和对象中的`singleton_class`方法?

时间:2015-06-19 11:39:00

标签: ruby metaclass

我在元类中定义了方法specific_data1specific_data2,并期望这些方法属于单例类:

class User
  def User.specific_data1
    "user specific data defined on user"
  end
  class << self
    def specific_data2
      "user specific data defined in meta class"
    end
  end
end

但是这两种方法都没有找到:

User.singleton_class.methods

请帮助我了解singleton_method课程User及其有用的内容。

3 个答案:

答案 0 :(得分:3)

Object#methods返回该对象的方法。类中定义的方法不是该类对象的方法,它们是该类实例的方法。

这与单例类无关,对所有类都是如此:

class Foo
  def bar; end
end

Foo.methods.include?(:bar)
# => false

Foo.new.methods.include?(:bar)
# => true

Foo.instance_methods
# => [:bar]

以下是您的示例:

User.methods.grep(/specific/)
# => [:specific_data1, :specific_data2]

User.singleton_methods
# => [:specific_data1, :specific_data2]

User.singleton_class.instance_methods.grep(/specific/)
# => [:specific_data1, :specific_data2]

答案 1 :(得分:0)

您定义的两个方法都定义为singleton_class上的实例方法。

User.singleton_class.instance_methods(false)
# => [:specific_data1, :specific_data2]

答案 2 :(得分:0)

Jorg正确地解决了你的问题的技术部分。你想检查

User.singleton_class.instance_methods

至于这个

  

请帮助我了解singleton_method课程User及其有用之处。&#34;

假设您有一个对象x,并且您想为它定义一个方法。一种方法是在x的类中定义方法,但这会产生为该类的所有其他对象定义方法的副作用!如果您只想为单个对象x定义方法,该怎么办?

Ruby通过让你创建一个只有单个实例的类来解决这个问题:x。这是单身人士课程。其中定义的方法只会影响x,因为单例类是x.class的子类,其唯一的实例是x。单例方法只是单例类中定义的常规方法。