1. ホーム
  2. ruby

[解決済み] Rubyメタプログラミング:動的インスタンス変数名

2023-01-01 15:32:27

質問

以下のようなハッシュがあるとします。

{ :foo => 'bar', :baz => 'qux' }

オブジェクトのインスタンス変数となるキーと値を動的に設定するにはどうしたらよいでしょうか...。

class Example
  def initialize( hash )
    ... magic happens here...
  end
end

...その結果、モデルの内部は以下のようになります。

@foo = 'bar'
@baz = 'qux'

?

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

お探しの方法は instance_variable_set . だから

hash.each { |name, value| instance_variable_set(name, value) }

あるいは、もっと簡単に言うと

hash.each &method(:instance_variable_set)

インスタンス変数名に "@" がない場合(OPの例のように)、それを追加する必要があるので、以下のようになります。

hash.each { |name, value| instance_variable_set("@#{name}", value) }