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> (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |