を定義するには、変数名などの文字列を使用します。私は何をしたいかRubyは - 私は文字列の配列を持つ新しい変数
names = ['log_index', 'new_index']
は、名前の変数を作成することです:
names.each { |name| name = [] } # obviously it does not do what I want
これらの変数は、コードのどこかで宣言されていません。
どうすればいいですか?
を定義するには、変数名などの文字列を使用します。私は何をしたいかRubyは - 私は文字列の配列を持つ新しい変数
names = ['log_index', 'new_index']
は、名前の変数を作成することです:
names.each { |name| name = [] } # obviously it does not do what I want
これらの変数は、コードのどこかで宣言されていません。
どうすればいいですか?
新しいローカル変数をRubyで動的に定義する方法はありません。
Ruby 1.8ではeval 'x = 2'
で可能でしたが、
eval
またはbinding.local_variable_set
で既存の変数を変更できます。
hash
を使用して値を格納することを検討します。
この場合、 'hash.en_ {h、k | h [k] = []}){| i、obj | obj [i]} ' – engineersmnky
@ShambhaviShinde答えを受け入れることを検討すると、回答のスコアの下に記号「V」があります。 –
あなたはこのハックを使用することができます。
names.each { |name| eval "def #{name}; []; end" }
この場合、 'define_method'は' eval'よりも適切です。それは、常に空の配列を返すと言われています。これは、目的が情報をそこに格納することを前提としているので、あまり有用ではないようです。 – engineersmnky
あなたは動的ルビー内のローカル変数を定義することはできませんが、動的にインスタンス変数を定義することができます。
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 }
変数名の文字列はどういう意味ですか? –
'index'配列はどこから来ますか?なぜ、 'log_index = []'と 'new_index = []'を使って変数を手動で割り当てないのですか?あなたは何を達成しようとしていますか? – Stefan