Rubyでは、クラス定義に次のものを追加することで、getter/setterメソッドを作成できます。例えばすべてのインスタンス変数に `attr_reader`をリストアップせずに宣言する
attr_reader :key1, :key2, :key4
attr_writer :key1, :key2, :key3
または同等
attr_accessor :key1, :key2, :key3
class Foo
attr_reader :blah, :bar, :foo, :rah, :jar
def initialize a, b, c
@blah = calculate_blah(a,b)
@bar = calculate_bar(a)
@foo = calculate_foo(b,c)
@rah = calculate_rah(a,b,c)
@jar = calculate_jar(a,c)
end
# etc etc
end
のは、多くのインスタンス変数があるとしましょう、と私はそれらのすべてのgetterメソッド をしたいです。
attr_reader
をすべてのインスタンス変数に宣言することはできますか?
initialize
メソッドでは変数のリストを2つ(同一)保持する必要がなく、attr_reader
で別の変数のリストを保持する必要がないという利点があります。したがって、後で別のインスタンス変数を追加する場合は、リストに追加することなく、initialize
メソッドで設定するだけで済みます。
attr_reader
ですぐに利用できない場合は、おそらく一部のメタプログラミングを呼び出すことができますか?
ここでの主な目的は、これがRubyで可能かどうかを理解することです。 メタプログラミングを使用すると、パフォーマンスとあいまいさが発生することがよくあります。しかし、それはこの質問の範囲を超えています。
私はそれが正しいことであるかどうかではなく、何かをすることが可能かどうかを知ることにもっと興味があります。
を書くことができますが、これらのインスタンス変数の名前の配列を得ましたか。 –
実行時にインスタンス変数が存在しません。彼らは価値が割り当てられているときに生きる。これは、同じクラスの異なるインスタンスが、実行されるロジックに応じて異なるインスタンス変数セットを持つことができることを意味します。これを知ったので、オブジェクトのライフサイクルのどの時点でメソッドを作成したいのですか? –
"おそらくいくつかのメタプログラミング魔法が役立つかもしれません" - あなたの正確なユースケースは非常に不明ですが、それが純粋な怠惰から外れている場合は、メタプログラミングを伴わないでください。 100イーバーズのクラスは十分に悪いです:) –