self在单例类中定义的方法中的值

时间:2014-04-24 14:37:04

标签: ruby singleton metaprogramming

为什么在单例类中定义的方法(self)中的singleton2与其他三种情况中的单独类不相等?

    class A
      def self.singleton1
        class << self
          self
        end
      end

      class << self
        def singleton2
          self
        end
      end
    end

    def singleton3
      class << A
        self
      end
    end

    p [A.singleton1, A.singleton1.object_id]           # [#<Class:A>, 70003841656620]
    p [A.singleton2, A.singleton2.object_id]           # [A, 70003841656640]
    p [singleton3, singleton3.object_id]               # [#<Class:A>, 70003841656620]
    p [A.singleton_class, A.singleton_class.object_id] # [#<Class:A>, 70003841656620]

1 个答案:

答案 0 :(得分:3)

我将逐一解释。

 def self.singleton1
   class << self
     self
   end
 end

此处,方法内的selfA。现在,在方法中,您正在使用A创建另一个范围,即class << self的单例类的范围。当您调用self时,将返回单例类的A.singeton1,因为self的单例类中的A是方法{{1}的最后一个语句}。

singleton1

这里,class << self def singleton2 self end end 的单体类体内的self单体类本身。现在,您在类A上定义了单例方法singleton2。在方法内部,最后一个表达式是A,它始终设置为self,此处为receiver。还有一件事,A创建了一个新的范围,它与def singleton2的单例类的范围不同。

根据上述说明,我希望以下代码输出必须清楚: -

A

输出class A def self.singleton1 class << self self end end class << self def singleton2 self end end end A.singleton2 # => A A.singleton1 # => #<Class:A> A清楚地说明#<Class:A>为何不同。

从上面的两个解释中可以清楚地了解object_id的内容。