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

Posted

技术标签:

【中文标题】什么是类和对象中的“singleton_class”方法?【英文标题】:What is `singleton_class` method in class and object? 【发布时间】:2015-09-05 09:11:11 【问题描述】:

我在元类中定义了方法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

请帮助我了解User 课程中的singleton_method 是什么以及它有什么用处。

【问题讨论】:

【参考方案1】:

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]

【讨论】:

你是对的,但我担心的是为什么它们没有出现在 singleton_class 对象上。他们不属于单例类(元类) 它们是单例类的实例方法,也就是说它们是单例类的实例方法,即它们是User的方法。它真的像任何其他类一样工作。 String 的实例方法是String 实例的方法,而不是String 类本身。你可以split String 的一个实例,你不能split String 类。以此类推。 那么 User.singleton_class 方法返回什么 返回User的单例类。【参考方案2】:

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

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

【讨论】:

【参考方案3】:

Jorg 正确理解了您问题的技术部分。你要检查

User.singleton_class.instance_methods

至于这个

请帮助我了解User 课程中的singleton_method 是什么以及它有什么用处。”

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

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

【讨论】:

以上是关于什么是类和对象中的“singleton_class”方法?的主要内容,如果未能解决你的问题,请参考以下文章

什么是类? 什么是对象? 类和对象的区别是什么? 如何定义一个类、类

理解什么是类和对象

Java中的类和对象

什么是类?什么是对象?类和对象有什么关系?

什么是类,什么是对象,类和对象之间的关系

PHP面向对象(OOP)编程入门教程2.什么是类,什么是对象,类和对象之间的关系