query: tag:JRHG

RubyObjectクラスのコンストラクタ

RubyObjectクラスのコンストラクタは次のようになっています。

java>>
private RubyObject(){};

public RubyObject(Ruby runtime, RubyClass metaClass) {
    this.metaClass = metaClass;
    
    if (runtime.isObjectSpaceEnabled()) addToObjectSpace(runtime);
    if (runtime.getSafeLevel() >= 3) taint(runtime);
}

protected RubyObject(Ruby runtime, RubyClass metaClass, boolean useObjectSpace) {
    this.metaClass = metaClass;
    
    if (useObjectSpace) addToObjectSpace(runtime);
    if (runtime.getSafeLevel() >= 3) taint(runtime);
}

<<java

RubyObjectクラスのコンスラクタは、Rubyの実行環境であるruntime、作成されるRubyObjectインスタンスのメタクラス、そしてObjectSpaceクラスを有効にするかどうかのフラグを引数としています。

ObjectSpaceクラスは、Rubyの全てのインスタンスへの参照を持ちます。Javaでこうした機構を持つことは、非常にコストの高い選択になってしまうため、JRubyのデフォルトではオフになっています。

metaClass変数には、オブジェクトのメタクラスが入ります。メタクラスはRubyClassクラスのインスタンスです。そして、RubyClassクラスは、RubyModuleクラスを親クラスに持ちます。もちろん、そのRubyModuleクラスの親クラスは、RubyObjectクラスです。

また、デフォルトコンストラクタがプライベートになっています。これは、NEVERとUNDEFという特殊な定数のために使われています。NEVERは、配列の最後に配置される「番人」として利用されるとJavaDocに書かれていますが、どうやら必ずしもそうというわけではないようです。

posted by takai takai on Tue 28 Oct 2008 at 23:37 with 0 comments

JRubyオブジェクトの構造

指針

JRubyのソースコードを読むにあたって、オブジェクトから始めます。これは、『Rubyソースコード完全解説』を真似してのことで、特に深い意図はありません。この章では、JRubyのオブジェクトについて、次の順番で見ていくことにしましょう。これも、真似ですね。

  • アイデンティティ
  • メソッド
  • インスタンス変数

アイデンティティ

Meyerの『オブジェクト指向入門第2版』によると、オブジェクトとは「単に何らかのクラスのインスタンスである(邦訳P212)」と身も蓋もないことが書かれていました。その表現に倣うなら、JRubyのオブジェクトとは、「単なるRubyObjectクラス(とその子クラス)のインスタンス」です。

posted by takai takai on Mon 27 Oct 2008 at 06:19 with 0 comments