0

次のような動的変数を生成しようとしています。

varnum = rand(100000)
value = 5
instance_variable_set("@v" + varnum.to_s, value)

IRB で varnum が 345 を返した場合、生成された変数は @v345 であると推測できます。

ただし、スクリプトでコードを実行すると、どのように呼び出すことができますか? @v + varnum.to_s のようなもので変数にパッチを当てる方法はありますか?

4

3 に答える 3

4

残念ながら、変数を何にも割り当てずに、それを取得する正確な方法はありません。その場合は、単に使用できます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"] 
于 2012-07-03T13:24:54.507 に答える
1

さて、変数に再度アクセスしたい場合は、次の2つのいずれかを実行する必要があります。

  • 動的に生成するすべてのインスタンス変数の配列を保持します
  • インスタンス変数のリストを取得するために使用Object#instance_variablesし、で始まる変数のみを取り出しますv

値が残っているときに変数にアクセスするには、次を使用します。

instance_variable_get("@v#{varnum.to_s}")

ただし、ここにはさらに深刻な問題があります。インスタンス変数を動的に生成すること絶対にしないでください。オブジェクトの一部として乱数を介してデータにアクセスする必要がある場合は、たとえば、乱数を値にマッピングするハッシュである1つのインスタンス変数を用意します。@vs

于 2012-07-03T13:25:27.107 に答える
1
instance_variable_get("@v" + varnum.to_s)

これは、定義されたインスタンス変数を呼び出します

于 2012-07-03T13:24:02.280 に答える