加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

Ruby eigenclass意外行为

发布时间:2020-12-17 03:56:04 所属栏目:百科 来源:网络整理
导读:首先,让我们添加一个方法来检索“从 this blog post复制”的特征类 class Object def eigenclass class self self end end end 然后创建一个简单的类 class Aendputs A.new.eigenclass.superclass # = Aputs Class.new.eigenclass.superclass # = #Class:Obj
首先,让我们添加一个方法来检索“从 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>

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读