次のような動的変数を生成しようとしています。
varnum = rand(100000)
value = 5
instance_variable_set("@v" + varnum.to_s, value)
IRB で varnum が 345 を返した場合、生成された変数は @v345 であると推測できます。
ただし、スクリプトでコードを実行すると、どのように呼び出すことができますか? @v + varnum.to_s のようなもので変数にパッチを当てる方法はありますか?
次のような動的変数を生成しようとしています。
varnum = rand(100000)
value = 5
instance_variable_set("@v" + varnum.to_s, value)
IRB で varnum が 345 を返した場合、生成された変数は @v345 であると推測できます。
ただし、スクリプトでコードを実行すると、どのように呼び出すことができますか? @v + varnum.to_s のようなもので変数にパッチを当てる方法はありますか?
残念ながら、変数を何にも割り当てずに、それを取得する正確な方法はありません。その場合は、単に使用できますinstance_variable_get
この手法を 1 回だけ使用している場合は、間接的な手段で取得できる可能性があります。つまり、特別な名前を付けます... v 例として
ree-1.8.7-2011.03 :015 > instance_variables
=> ["@v48563", "@prompt"]
正規表現を使用して、これに grep を追加できます。
ree-1.8.7-2011.03 :016 > instance_variables.grep(/@v/)
=> ["@v48563"]
さて、変数に再度アクセスしたい場合は、次の2つのいずれかを実行する必要があります。
Object#instance_variables
し、で始まる変数のみを取り出しますv
。値が残っているときに変数にアクセスするには、次を使用します。
instance_variable_get("@v#{varnum.to_s}")
ただし、ここにはさらに深刻な問題があります。インスタンス変数を動的に生成することは絶対にしないでください。オブジェクトの一部として乱数を介してデータにアクセスする必要がある場合は、たとえば、乱数を値にマッピングするハッシュである1つのインスタンス変数を用意します。@vs
instance_variable_get("@v" + varnum.to_s)
これは、定義されたインスタンス変数を呼び出します