Ruby eigenclass意外行为

首先,让我们添加一个方法来检索“从 this blog post复制”的特征类

class Object 
  def eigenclass 
    class << self
      self
    end 
  end 
end

然后创建一个简单的类

class A
end

puts A.new.eigenclass.superclass      # => A
puts Class.new.eigenclass.superclass  # => #<Class:Object>

我期待第二次投入输出Class

任何线索为什么会这样?

解决方法

从该博文中,您可以构建一个类似的图表:

+------------------+               +-------------------+
                        |      Object      |- eigenclass ->| Object eigenclass |
                        +------------------+               +-------------------+
                                 ^                                   ^             
                                 | superclass             superclass |                                                     
                        +------------------+               +-------------------+
                        |        A         |- eigenclass ->|    A eigenclass   |
                        +------------------+               +-------------------+
                                 ^
                                 | superclass
+-------+               +------------------+                                   
| A.new |- eigenclass ->| A.new.eigenclass |                                   
+-------+               +------------------+

试图找到A实例的本征类的超类表明它指向A类.

A.new.eigenclass.superclass      # => A

Class.new返回Class对象的实例,即新类.这是一个类,就像A类一样.

Class.new.class # => Class
A.class         # => Class

A的超类和Class.new的超类都是隐式的Object.

Class.new.superclass # => Object
A.superclass         # => Object

因为A的超类是Object,A的本征类的超类是Object的特征类.

Object.eigenclass                            # => #<Class:Object>
A.eigenclass.superclass                      # => #<Class:Object>
A.eigenclass.superclass == Object.eigenclass # => true

类似地,找到Class.new的本征类的超类产生Object的本征类

Class.new.eigenclass.superclass              # => #<Class:Object>

Class.new和A.new之间的区别在于Class.new本身就是一个类,因此可以构造新对象,而A.new则不能.

Class.new.new # => #<#<Class:0x007f86b50d8f70>:0x007f86b50d8f20>
A.new.new     # => NoMethodError: undefined method `new' for #<A:0x007f86b50cbf50>

相关文章

validates:conclusion,:presence=>true,:inclusion=>{...
一、redis集群搭建redis3.0以前,提供了Sentinel工具来监控各...
分享一下我老师大神的人工智能教程。零基础!通俗易懂!风趣...
上一篇博文 ruby传参之引用类型 里边定义了一个方法名 mo...
一编程与编程语言 什么是编程语言? 能够被计算机所识别的表...
Ruby类和对象Ruby是一种完美的面向对象编程语言。面向对象编...