Ruby元类类层次结构
关于元类及其在Ruby对象模型中的位置有一个类层次结构图。在它里面,Ruby元类类层次结构,ruby,metaprogramming,Ruby,Metaprogramming,关于元类及其在Ruby对象模型中的位置有一个类层次结构图。在它里面,Class:Class(Class的单例类)是它自身的一个实例,但我认为它应该是Class的一个实例。换句话说,如果对象class\u singletonclass如下所示: class_singletonclass = Class.singleton_class # => #<Class:Class> 新类的元类是class。表明类的元类实际上是类,这适用于所有元类。我已经将上面链接到Ruby 2.0的帖子
Class:Class
(Class
的单例类)是它自身的一个实例,但我认为它应该是Class
的一个实例。换句话说,如果对象class\u singletonclass
如下所示:
class_singletonclass = Class.singleton_class
# => #<Class:Class>
新类的元类是class。表明
类的元类实际上是类
,这适用于所有元类。我已经将上面链接到Ruby 2.0的帖子中的继承
扩展修改为:
继承.c
#include "ruby.h"
VALUE real_super(VALUE self)
{
return RCLASS_SUPER(RBASIC(self)->klass);
}
VALUE real_klass(VALUE self)
{
return RBASIC(self)->klass;
}
void Init_inheritance()
{
rb_define_method(rb_cClass,"real_super",real_super,0);
rb_define_method(rb_cClass,"real_klass",real_klass,0);
}
测试.rb
require_relative 'inheritance'
puts "Object real class: #{Object.real_klass}"
puts "Object real superclass: #{Object.real_super}"
puts "Class real class: #{Class.real_klass}"
puts "Class real superclass: #{Class.real_super}"
puts "Class metaclass real class: #{Class.singleton_class.real_klass}"
puts "Class metaclass real superclass: #{Class.singleton_class.real_super}"
puts "Object metaclass real class: #{Object.singleton_class.real_klass}"
puts "Object metaclass real superclass: #{Object.singleton_class.real_super}"
puts "An object singleton class real class: #{Object.new.singleton_class.real_klass}"
puts "An object singleton class real superclass: #{Object.new.singleton_class.real_super}"
输出为:
Object real class: #<Class:Object>
Object real superclass: #<Class:BasicObject>
Class real class: #<Class:Class>
Class real superclass: #<Class:Module>
Class metaclass real class: #<Class:#<Class:Class>>
Class metaclass real superclass: #<Class:#<Class:Module>>
Object metaclass real class: #<Class:#<Class:Object>>
Object metaclass real superclass: #<Class:#<Class:BasicObject>>
An object singleton class real class: #<Class:Object>
An object singleton class real superclass: #<Class:BasicObject>
对象真实类:#
对象实超类:#
班级真实班级:#
类实超类:#
类元类实类:#
类元类实超类:#
对象元类实类:#
对象元类实超类:#
对象单例类real类:#
对象单例类实超类:#
因此,在元类的情况下,klass
指向元类本身(图中的这一部分是正确的,但指出了和中的一些不一致之处)。可能值得制作您自己的图表版本。我对你的问题的理解是“元类
(蓝色)上的循环虚线(代表的实例)实际上不应该循环到自身,而是应该指向常规类
(绿色),对吗?”-我几乎不理解这一点,这没有帮助,但我现在在回答你的问题时遇到了一些困难。是的,这就是我想说的。对不起,如果我的措辞太让人困惑的话。它试图解开“类”这个词的许多区别。我认为要把这个问题写清楚需要付出巨大的努力。我的答案打得有点匆忙,所以我只是想澄清一下。图中正确的部分表明Class:Class
是自身的实例,但由于这适用于所有元类(即元类是自身的实例),图中关于Class:Object
和Class:Module
的部分是不正确的,至少对于Ruby 2.0来说是这样,然后,class.c
中的注释应该解释为Ruby语义,而不是实现。从Ruby的角度来看,元类是在类层次结构中遍历的匿名类。
Object real class: #<Class:Object>
Object real superclass: #<Class:BasicObject>
Class real class: #<Class:Class>
Class real superclass: #<Class:Module>
Class metaclass real class: #<Class:#<Class:Class>>
Class metaclass real superclass: #<Class:#<Class:Module>>
Object metaclass real class: #<Class:#<Class:Object>>
Object metaclass real superclass: #<Class:#<Class:BasicObject>>
An object singleton class real class: #<Class:Object>
An object singleton class real superclass: #<Class:BasicObject>