3

ちょっとした趣味のプロジェクトとして、私は独自のオブジェクト システムを構築しようとしています。Objectすべてのクラスのデフォルトの継承を から基本クラスに変更する方法があるかどうか疑問に思っていたEntityので、新しいクラスを作成するたびに明示的に言う必要はありませんclass Thing < Entity; class Thing理想的には、デフォルトのスーパークラスを自分のクラスと言って、持つことができるでしょうEntity

4

2 に答える 2

6

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);
    // ...

しかし、これは非常に手間がかかり、カスタム Ruby にパッチを適用して実行する必要があり、おそらく多くの落とし穴やハードコーディングされたものがObjectデフォルトであると想定する必要があります。

それに加えて、ポイントは何ですか?デフォルトのスーパークラスを別のものに置き換えるObjectと、Ruby コアのクラスを含むすべてのクラスが、この新しいデフォルトのスーパークラスを継承するようになります。それ自体を変更するだけでObject、カスタム Ruby を必要とせずに、はるかに簡単に同じ効果 (別の名前なし) を得ることができます。それがクラスを再開できることの美しさです!例えば:

class Object
  def foo
    'bar!'
  end
end

class A; end

A.new.foo  #=> 'bar!'

親切にしたい場合は、関連するすべてのメソッドをEntityクラスの代わりにモジュールにinclude入れてからObject.

于 2013-06-27T03:10:26.753 に答える