Des*_*ams 2 ruby inheritance metaprogramming class
作为一个小爱好项目,我正在尝试建立自己的对象系统.我想知道是否有一种方法可以将所有类的默认继承更改Object为我的基类Entity,这样每当我创建一个新类时,我都不必明确说出class Thing < Entity; 理想情况下,我只能说class Thing并将其默认超类作为我的Entity班级.
当然,你可以通过修改Ruby源代码的相关部分并重新编译Ruby 来实现这一点:
VALUE
rb_define_class_id(ID id, VALUE super)
{
    VALUE klass;
    if (!super) super = rb_cObject;  // <-- where the default is set
    klass = rb_class_new(super);
    // ...
Run Code Online (Sandbox Code Playgroud)
但这是一个巨大的麻烦,需要修补和运行自定义Ruby,可能有很多陷阱和硬编码的东西Object是默认的.
而且,最重要的是,重点是什么?如果Object用其他东西替换为默认超类,那么每个类 - 包括Ruby核心中的类 - 现在将继承自这个新的默认超类.您可以更轻松地获得相同的效果(只是没有不同的名称),只需更改Object自己就不需要自定义Ruby .这是能够重新开课的美妙之处!例如:
class Object
  def foo
    'bar!'
  end
end
class A; end
A.new.foo  #=> 'bar!'
Run Code Online (Sandbox Code Playgroud)
如果你想要善良,你甚至可以将所有相关的方法放在一个Entity模块而不是一个类中,然后include放入Object.