2017-09-01 10 views
0

を定義するには、変数名などの文字列を使用します。私は何をしたいかRubyは - 私は文字列の配列を持つ新しい変数

names = ['log_index', 'new_index'] 

は、名前の変数を作成することです:

names.each { |name| name = [] } # obviously it does not do what I want 

これらの変数は、コードのどこかで宣言されていません。

どうすればいいですか?

+2

変数名の文字列はどういう意味ですか? –

+1

'index'配列はどこから来ますか?なぜ、 'log_index = []'と 'new_index = []'を使って変数を手動で割り当てないのですか?あなたは何を達成しようとしていますか? – Stefan

答えて

4

新しいローカル変数をRubyで動的に定義する方法はありません。

Ruby 1.8ではeval 'x = 2'で可能でしたが、

evalまたはbinding.local_variable_setで既存の変数を変更できます。

hashを使用して値を格納することを検討します。

+0

この場合、 'hash.en_ {h、k | h [k] = []}){| i、obj | obj [i]} ' – engineersmnky

+0

@ShambhaviShinde答えを受け入れることを検討すると、回答のスコアの下に記号「V」があります。 –

0

あなたはこのハックを使用することができます。

names.each { |name| eval "def #{name}; []; end" } 
+0

この場合、 'define_method'は' eval'よりも適切です。それは、常に空の配列を返すと言われています。これは、目的が情報をそこに格納することを前提としているので、あまり有用ではないようです。 – engineersmnky

0

あなたは動的ルビー内のローカル変数を定義することはできませんが、動的にインスタンス変数を定義することができます。

names = ['log_index', 'new_index'] 
names.each { |name| instance_variable_set("@#{name}", []) } 

これは、あなたに与えます:

@log_index 
=> [] 
@new_index 
=> [] 

instance_variable_getでインスタンス変数に動的にアクセスすることもできます。

names = ['log_index', 'new_index'] 
names.each { |name| puts instance_variable_get("@#{name}").inspect } 
関連する問題