2

私はこのように書かれたいくつかのコードを持っています

$ var1 = 2
$ var2 = 4
..。

キーワード={"one"=> $ var1、 "two" => $ var2、...}

問題は、ハッシュするときにその変数に格納されている値を取得したいのですkeywordsが、rubyは必要なときに変数を再評価していないようです。したがって、$var1実行中に変更された場合keywords["one"]でも、元の値を返します。2

最初にアクセスする必要のある変数を決定し、次にその値を取得するようにハッシュを変更するにはどうすればよいですか?

かなりの数のグローバル変数があり(それらは配列を使用しませんでしたか?)、冗長なcase/whenまたはif/elsifブロックは必要ありません。

編集:より正確な質問は

「変数が現在指している値を取得するにはどうすればよいですか?」

4

2 に答える 2

3

一般的に、これは悪い考えのようです。$ var1を更新する代わりに、ハッシュを更新し、keywords["one"]を介して常に$var1にアクセスします。

evalを使用することもできますが、それは良い解決策ではありません。

$var1 = 2
$var2 = 4
...
keywords = {"one" => "$var1", "two" => "$var2", ...}
$var1 = 6
var1 = eval(keywords["one"])  # -> 6

更新:evalは、渡されたすべてのコードを取得して実行することに注意してください。あなたが評価しているものがあなたが期待する形であることに非常に注意する必要があります。これは大きなセキュリティリスクになる可能性があります。

于 2012-05-18T20:01:21.480 に答える
1

変数には値が含まれていません。値を参照します。あなたが書くとき:

foo = 2
bar = [foo]
foo = 4

…なることはありませbar[4]。〜何が起こるか:

  1. 2メモリに値を作成し、fooそれを参照するように変数を設定します。
  2. foo最初のスロットが(ie )によって参照される値を参照する新しい配列を作成し、その配列を参照するよう2に変数barを設定します。
  3. メモリに値を作成し、代わりにそれを参照するように4変数を変更します。foo

変更可能な一部のオブジェクトタイプ。たとえば、文字列または配列の実際の内容を変更して異なるものにすることができます。この場合、その値へのすべての参照は変更を反映しています。

foo = "hello"
bar = [foo]
foo[0] = "j"
p bar        #=> ["jello"]

ただし、数値は変更できません。変更できる数値よりも「ハンドル」を使用し、その数値への他のすべての参照を変更する場合は、数値を可変データ型でラップする必要があります。例えば:

$var1 = [2]
keywords = { "one"=>$var1 }
p keywords["one"][0] #=> 2
$var1[0] = 4
p keywords["one"][0] #=> 4

ここで、値が数値ではなく文字列である場合(「キーワード」が意味するように)、それらを変更して完全に置き換えることができます。

$var1 = "foo"
keywords = { "one"=>$var1 }
$var1.replace( "bar" )
p keywords["one"]           #=> "bar"

重要なのは、オブジェクト自体でメソッドを呼び出す必要があることです(そして、そのメソッドは、新しいオブジェクトを返すのではなく、オブジェクト自体を変更する必要があります)。変数代入を使用してこれを機能させることはできません。たとえば、を参照してくださいString#replace

于 2012-05-18T19:58:28.010 に答える