2011-07-19 13 views
0

私はRubyオープンクラスの作業を理解しようとしています。特に、メソッドは既存のクラスにどのように追加されますか?Rubyオープンクラスの理解

クラスがすでに存在するかどうかを識別するためにいくつかのロジックが適用されている必要があります。

誰かが概念を説明できますか?

ありがとうございます。

+2

クラスがすでに存在するかどうかを確認するために 'class'キーワードがどのように実装されているのでしょうか? –

答えて

3
それは、クラス名が既に存在するかどうかを確認するために非常に簡単ですので

クラス名は、定数である:

Object.constants.grep(/Array/) #=> ["Array"] 

だから、クラスがすでに定義されている場合(Object.const_get('Array').is_a? Class)メソッドは、それに追加されます、そうでない場合は、新しいクラス定義される。もう少し正確であるためには、これはRubyのC側で発生しますが、それは多かれ少なかれ魅力的です。

2

Rubyの下にメッセージがあります。

クラスAがあり、aAのインスタンスであるとします。あなたはaにメソッドfooを呼び出すと

Basic Object 
-> Object 
-> A 
-> a 

、本当に何が起こっているのか、あなたがaにメッセージ「コールfoo」を送っているである:実際に関与するいくつかのクラスがあります。インスタンスメソッドがa(singleton/eigenclassのように)に定義されているかどうかを確認し、A、次にObject、そして最後にBasic Objectのインスタンスメソッドを試行します。他のすべてが失敗した場合、VMは新しいメッセージ(つまり「メソッドが見つかりません」)を送信し、捕捉されるまで再開します(デフォルトでは例外が発生します)。

aの動作を変更するために、階層内の任意のクラスに新しいメソッド(メッセージハンドラ)を追加できます。 AまたはObjectにインスタンスメソッドを追加すると、aにインスタンスメソッドが追加されます。メソッドをa(つまりdef a.bar; 'bar'; end)にのみ追加すると、Aの他のインスタンスにもメソッドが追加されます。

ルビーのクラス(私は、ルビーのオブジェクトを言う方が適切だろうと主張しています)は、これらの新しいメソッド、つまりメッセージハンドラをいつでも追加できます定義されている。