2012-03-02 5 views
2

私はハッシュを扱うためにevalを使用しています。この部分は動作します:リファレンスによるハッシュのRuby変更値

some_hash = {"a" => {"b" => "c"}} 
target_hash = "some_hash" 
target_key = "['a']" 

my_value = eval(target_hash + target_key) 
puts "my_value " + my_value.to_s 

と版画:私は、evalのを使用して、値を変更する方法を

my_value {"b"=>"c"} 

をするように、この内のハッシュ結果:

some_hash = {"a" => {"d" => "e"}} 

おかげ

編集:

私は正しく説明しているとは思わない。私はハッシュを掘り下げなければならないが、実行時に設定された文字列を柔軟に処理する必要がある。その文字列は、some_hash['key_level_1']['key_level_2']['key_level_3']を参照するとされている"['key_level_1']['key_level_2']['key_level_3']"である可能性があります。

もう一度、その値を何かに設定する必要があります。それは理にかなっていますか?

+2

は、ここでevalを、errはevil--使用* *ない考えてみましょう。一般的なケースでは、この問題に近づくための多数の「クリーンな方法」があります。 –

+0

ハ、私は誰かがそれを言うだろうと知っていた。何かヒント? plsは、感謝の下、私のコメントを参照してください。 – dt1000

+1

いいえ、真剣にも、これはひどいです。 "a"がうまくいくところでは[["a"]]を使う理由はありません。 _syntax_!をパラメータ化する必要はありません。 –

答えて

0

私はこのような方法で設定することをお勧め:

def hash_change(target_hash,target_key,*new_value) 
    if new_value 
      target_hash["target_key"] = new_value 
    end 
    puts "my_value " + target_hash["target_key"] 
end 

新しい値を渡す必要があるのいずれかにあなたに柔軟性を与え、元のか、新しいハッシュを表示します。

編集:申し訳ありませんが、私は、例えば、配列を取る方法

hash_change(some_hash,"a",{"d" => "e"}) 
+0

私は正しく説明してるとは思いません。私はハッシュを掘り下げなければならないが、実行時に設定された文字列を柔軟に処理する必要がある。その文字列は、[ 'key_level_1'] [ 'key_level_2'] [ 'key_level_3を'] some_hashを参照することになっている "[ 'key_level_1'] [ 'key_level_2'] [ 'key_level_3']" である可能性があります。もう一度、その価値を何かに設定する必要があります。それは理にかなっていますか? – dt1000

+0

ええ、私はあなたに従っていない。質問に入れることができるより具体的な例がありますか? – ScottJShea

1

への呼び出しを忘れてしまいました['key1', 'key2', 'key3'](適切にフォーマットされた文字列から構成できます)と "ルートオブジェクト"を使用して、特定の "ターゲットオブジェクト"ブランチの場所を特定します(再帰を推奨します)。次に、見つかった適切なオブジェクトを操作します。この場合、some_hashは、文字列ではなく、トラバーサルを開始する「ルートオブジェクト」である必要があります。

実際に古い(私はまだ積極的にルビーを使用していました)の回答の回答へのリンクです。それは割り当てビットを処理しませんが、私はそれが評価のない有効なアプローチの開始を示していると信じています:How do you access nested elements of a hash with a single string key? "対象オブジェクト"が見つかった後、それはちょうど特定のキーに新しい値を割り当てる問題です。 (リンクされたポストの受け入れられた答えは、少し謎めいて、シンボルが漏れていない場合でも、宝石です。)

ハッピーコーディング。

0

ありがとうございました。私は少しそれを変更しました。代わりに、アレイとして文字列を渡すと、私はこのようなオブジェクトを渡す:

{some_hash => {"a" => {"b" => "nil"}}} 

そして私は再帰的基準、および実際のハッシュの両方を横切ります。参照でnilが検出されたら、私はそこにいることを知っています。あなたが使用することができます

1

Hash#replace

def changeHash(a, b, targetHash, targetKey) 
    change = ".replace({'#{a}' => '#{b}'})" 
    my_value = eval(target_hash + target_key + change) 
end 

some_hash = {"a" => {"b" => "c"}} 
target_key = "['a']" 
changeHash('d', 'e', 'some_hash', '["a"]') 
関連する問題