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的帖子

关于元类及其在Ruby对象模型中的位置有一个类层次结构图。在它里面,
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>