1. ホーム
  2. ruby

[解決済み] インスタンス変数の値をその名前で取得する

2022-12-09 02:21:31

質問

一般に、文字列で指定した名前のオブジェクトへの参照を取得するにはどうすればよいのでしょうか。

具体的には、私はパラメータ名のリストを持っています(メンバー変数 - 動的に構築されるので、私はそれらを直接参照することはできません)。

各パラメータはオブジェクトであり、また from_s メソッドを持つオブジェクトです。

のようなことをしたいのですが(もちろんうまくいきませんが・・・)。

define_method(:from_s) do | arg |
    @ordered_parameter_names.each do | param |
        instance_eval "field_ref = @#{param}"
        field_ref.from_s(param)
    end
end

どのように解決するのですか?

最も慣用的な方法としては

some_object.instance_variable_get("@#{name}")

を使う必要はありません。 + または intern Ruby はこれをうまく処理します。しかし、もしあなたが他のオブジェクトに手を伸ばし、そのivarを引き出すことに気づいたら、カプセル化を壊している可能性が高いです。

もしあなたが明示的にivarにアクセスしたいのであれば、正しいことはそれをアクセサにすることです。次のように考えてみてください。

class Computer
  def new(cpus)
    @cpus = cpus
  end
end

この場合、もしあなたが Computer.new とすると、強制的に instance_variable_get を使うことになります。 @cpus . しかし、もしあなたがこれをやっているなら、おそらくは @cpus を公開することでしょう。あなたがすべきことは

class Computer
  attr_reader :cpus
end

これで Computer.new(4).cpus .

を再び開くことができることに注意してください。 任意の を開き、プライベートの ivar をリーダーにすることができます。アクセッサは単なるメソッドなので、以下のようなことができます。 Computer.new(4).send(var_that_evaluates_to_cpus)