4

私はいくつかの基本 Ruby クラスを拡張するライブラリを作成し、主にメソッド エイリアシングを通じてラッパーを観察しました。しかし、Array インスタンス化の短縮形で障害にぶつかりました (例: @a = [1, 2, 3]Array オブジェクトの作成時に省略形で実際に呼び出されるメソッドを見つけることができないようです)。これ#[]は、現在のスコープで継承されたメソッドでも、祖先チェーン内のクラスまたはモジュールから継承されたメソッドでもありません。また、Ruby C コードに基づいて、Array クラス オブジェクトのクラスから#newインスタンス#initialize、singleton_methodまで、すべてのメソッドをオーバーロードまたは監視しました。#[]

rb_define_singleton_method(rb_cArray, "[]", rb_ary_s_create, -1);

省略形の Array インスタンスのインスタンス化のメソッドチェーン内にあるメソッドを割り当てる方法を知っている人はいますか?

4

1 に答える 1

2

残念ながら、地球上のほとんどすべてのプログラミング言語と同様に、Ruby ではリテラルのオーバーロードが許可されていません。リテラルのオーバーロードが必要な場合は、IokeSephなど、それをサポートする数少ないプログラミング言語のいずれかを使用する必要があります。

Ioke での例を次に示します。

[] = method(foo, foo println)
[1]
; 1

そしてセフで:

[] = #(foo, foo println)
[1]
; 1

[もちろん、これらはシステムに大混乱をもたらすことに注意してください。たとえば、Ioke/Seph 標準ライブラリの大部分は Ioke/Seph で実装されており、あらゆる場所でリストを使用しているため、本番環境ではシステム、これを適切にカプセル化する必要があります。]

于 2011-11-14T10:06:00.133 に答える