2011-06-21 15 views
6

ハッシュ要素を抽出してローカル変数に変換するブロックを作成できますが、ネイティブメソッドが既に存在するかどうかは疑問です。PHPの抽出に相当するRubyはありますか?

extract({ :foo => 'bar', :foo2 => 'bar2' }) 
puts foo # 'bar' 
puts foo2 # 'bar2' 

このキーはプライベートであり、スコープはローカルに留まる必要があることに注意してください。

+0

はい、dragons、trueです。この場合、すべての私的でローカルなので、ドラゴンが少なく、かなり不快なハッシュvar名+メンバーのトンを扱います。抽出物は必要ではないがいい。 – glortho

答えて

7

あなたは近くに取得することができます。

bar, bar2 = h.values_at :foo, :foo2 

または私たちはできると仮定しハッシュを拡張してインスタンス変数に展開する:

class Hash 
    def extract o 
    each { |k, v| o.instance_variable_set '@' + k.to_s, v } 
    end 
end 

h.extract self 

p [@foo, @foo2] 
+0

私はこのことに気づいていませんでした。ありがとうございました。しかし、たくさんの鍵があれば、それは価値がある節約では不十分です。特にキー名を変更すると、それを変更しますこの課題で2回、そしてあなたがどこでそれを使用したとしても、もう一度。あなたはローカル変数名を一般化することができますが、それは私が望んでいるものではありません。可能ではないかもしれませんが、その場合は...そうです! – glortho

+0

これは完全に自動化された方法で更新しましたが、ローカルスコープルールに違反しています。 – DigitalRoss

+0

Handy!私はこの種の質問には、あらゆる種類のトリックを学んでいるので、決して完全には答えられないことを願っています。 :-) – glortho

1

あなたは各key=>valueペアを反復処理するeachメソッドを使用することができます。

{ :foo => 'bar', :foo2 => 'bar2' }.each do |key, value| 
    print key,"\t",value,"\n" 
end 

出力:

foo  bar 
foo2 bar2 
+0

ありがとう、テディ。私はブロックでそれを行うことができることを知っています。簡単な方法を探しているだけです。 – glortho

関連する問題