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

What is `singleton_class` method in class and object?

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

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

请帮助我了解 User class 上的 singleton_method 是什么以及它有什么用。

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

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

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]

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

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

Jorg 答对了您问题的技术部分。你想检查

User.singleton_class.instance_methods

这个

Please help me understand what singleton_method on User class is and how it is useful."

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

Ruby 通过让您创建一个只有 单个 实例的 class 来解决这个问题:x。这是单例class。其中定义的方法只会影响 x,因为单例 class 是 x.class 的子 class,并且它的唯一实例是 x。单例方法只是在单例中定义的常规方法 class.