人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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)

●質問者: littlebangkok
●カテゴリ:コンピュータ インターネット
✍キーワード:echo Hello object PHP Ruby
○ 状態 :終了
└ 回答数 : 3/3件

▽最新の回答へ

1 ● kenichiice
●27ポイント

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

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

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

◎質問者からの返答

わかりやすい回答です。

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


2 ● tmasao
●27ポイント

最も単純な指定の仕方は 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
◎質問者からの返答

わかりやすい回答です。

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

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

引き出しが増えました!

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

宜しいのでしょうか?


3 ● しおり
●26ポイント

目的がよく分かりませんが、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
◎質問者からの返答

わかりやすい回答です。

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

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

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

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

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ