Ruby で、変数に入力された文字列を、新しい変数名として利用するにはどうしたらよいのでしょうか?


例となるコードが PHP となってしまい申し訳ありませんが、やりたいのは下記の通りです。
また、ローカル変数だけではなく、インスタンス変数でも実現可能なのでしょうか?

<?php
$variable = 'say';
$${variable} = 'Hello, world!';
echo $say; // Hello, world!
?>

Ruby で実行すると、下記のエラーが発生します。

say.rb
#!/usr/bin/ruby
variable = 'say'
#{variable} = 'Hello, world'
puts say

% ruby say.rb
say.rb:3: undefined local variable or method `say' for main:Object (NameError)

回答の条件
  • 1人2回まで
  • 登録:2008/03/05 17:54:08
  • 終了:2008/03/12 17:55:02

回答(3件)

id:kenichiice No.1

kenichiice回答回数48ベストアンサー獲得回数72008/03/06 00:02:26

ポイント27pt

インスタンス変数であれば、

variable = 'say'
eval("@#{variable} = 'Hello, world'")
puts @say

のように eval を使えばできると思います。

id:littlebangkok

わかりやすい回答です。

どうもありがとうございます。

2008/03/06 01:10:36
id:tmasao No.2

tmasao回答回数76ベストアンサー獲得回数202008/03/06 00:10:26

ポイント27pt

最も単純な指定の仕方は eval を使うことでしょうか。

variable = 'say'
eval("#{variable} = 'Hello, world'")
puts say

インスタンス変数に代入する場合は、Object#instance_eval を使うか、Object#instance_variable_set があります。

variable = 'say'
hoge.instance_eval("@#{variable} = 'Hello, world'")
class Hoge
  def fuga
    variable = 'say'
    instance_variable_set("@#{variable}", 'Hello, world')
    puts @say
  end
end
id:littlebangkok

わかりやすい回答です。

どうもありがとうございます。

あと、Object#instance_eval と Object#instance_variable_set で、

引き出しが増えました!

あと、外部からの入力ではなくても、eval の引数は汚染のチェックをした方が

宜しいのでしょうか?

2008/03/06 01:16:18
id:Bookmarker No.3

しおり回答回数191ベストアンサー獲得回数342008/03/06 00:44:22

ポイント26pt

目的がよく分かりませんが、eval を使えば一応できます。

variable = 'say'
eval("#{variable} = 'Hello, world'; puts say")

読み書きし易くするなら、ヒアドキュメントにして eval とか。

variable = 'say'
eval <<EOS
  #{variable} = 'Hello, world'
  puts say
EOS

インスタンス変数の場合は、Object#instance_variable_set でできます。

variable = 'say'
class Foo
  def bar
    puts @say
  end
end
foo = Foo.new
foo.instance_variable_set("@#{variable}", 'Hello, world')
foo.bar
id:littlebangkok

わかりやすい回答です。

どうもありがとうございます。

目的は、変数名をハッシュのキー名にしたかったんです。

自分が実行したかった実装だと、変数名をハードコーディングしてしまうと、

処理の用途の数だけメソッドを記述する必要に迫られたからです。

2008/03/06 01:15:19

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません