【问题标题】:What is `singleton_class` method in class and object?什么是类和对象中的“singleton_class”方法?
【发布时间】: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 是什么以及它有什么用处。

【问题讨论】:

    标签: ruby metaclass


    【解决方案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。单例方法只是在单例类中定义的常规方法。

      【讨论】:

        猜你喜欢
        • 2022-01-25
        • 1970-01-01
        • 2012-11-29
        • 2021-01-08
        • 1970-01-01
        • 1970-01-01
        • 2019-04-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多