私はRubyオープンクラスの作業を理解しようとしています。特に、メソッドは既存のクラスにどのように追加されますか?Rubyオープンクラスの理解
クラスがすでに存在するかどうかを識別するためにいくつかのロジックが適用されている必要があります。
誰かが概念を説明できますか?
ありがとうございます。
私はRubyオープンクラスの作業を理解しようとしています。特に、メソッドは既存のクラスにどのように追加されますか?Rubyオープンクラスの理解
クラスがすでに存在するかどうかを識別するためにいくつかのロジックが適用されている必要があります。
誰かが概念を説明できますか?
ありがとうございます。
クラス名は、定数である:
Object.constants.grep(/Array/) #=> ["Array"]
だから、クラスがすでに定義されている場合(Object.const_get('Array').is_a? Class
)メソッドは、それに追加されます、そうでない場合は、新しいクラス定義される。もう少し正確であるためには、これはRubyのC側で発生しますが、それは多かれ少なかれ魅力的です。
Rubyの下にメッセージがあります。
クラスA
があり、a
がA
のインスタンスであるとします。あなたは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
の他のインスタンスにもメソッドが追加されます。
ルビーのクラス(私は、ルビーのオブジェクトを言う方が適切だろうと主張しています)は、これらの新しいメソッド、つまりメッセージハンドラをいつでも追加できます定義されている。
クラスがすでに存在するかどうかを確認するために 'class'キーワードがどのように実装されているのでしょうか? –