2012-02-02 23 views
29

誰かがハッシュにキーが存在するかどうかをチェックし、デフォルト値を与えない場合はルビーの方法で表示できますか?私はこれをしない限り、1つのライナーがあると仮定しているが、私は何を使用するか分からない。あなたはハッシュにそのデフォルト値を格納する必要がない場合はキーが存在しない場合デフォルト値を作成

答えて

11

あなたはHash#fetchメソッドを使用することができます。

hash = {} 
hash.fetch(:some_key, 'default-value') # => 'default-value' 
p hash 
# => {} 

あなたはデフォルト値あなたは存在しないキーにアクセスするたびに格納するほかに必要がある場合は、あなた「あなたはブロックでHash#newを使用してそれを行うことができ、ハッシュを初期化するものを再:

hash = Hash.new { |hash, key| hash[key] = 'default-value' } 
hash[:a] = 'foo' 
p hash[:b] 
# => 'default-value' 
p hash 
# => { :a => 'foo', :b => 'default-value' } 
15

ハッシュクラスのコンストラクタデフォルト値を受け入れ一致するキーが見つからない場合、同じことが返されます。

h.fetch(key, "default value") 

それとも、非既存のキーがnilが返されるという事実活用:あなたはすでにハッシュを持っている場合は

h = Hash.new("default") 

h.has_key?("jake") 
=> false 

h["jake"] 
=> "default" 

h["jake"] = "26" 
h.has_key?("jake") 
=> true 
43

、あなたはこれを行うことができます

h[key] || "default value" 

作成するにはあなたが正確にやりたいことに依存するデフォルト値でハッシュします。

  • キーの独立して保存されることはありません。キーに依存

    h = Hash.new("foo") 
    h[1] #=> "foo" 
    h #=> {} 
    
  • と保存されます。

    h = Hash.new { |h, k| h[k] = k * k } 
    h[2] #=> 4 
    h #=> {2=>4} 
    
+2

h [key] ||を使用すると、 "デフォルト値"は保存されていませんが、すでにそこにfalseがある場合はオーバーライドされます – Sebastian

+0

そのため、私はそれをいくつかの可能性の1つとして挙げました。一般的に、ブール値を保存しないことがわかっている場合、ハッシュの値がどのようなものになるかという考えが人々にあります。これは完璧な方法です。 –

3

デフォルト値を保存している場合それはゼロになる可能性があり、保存時に計算する必要があります:

hash = {} 
... 
hash.fetch(key) {|k| hash[k] = calc_default()} 
1

あなたは鍵が(まだ)存在しない場合は、ハッシュにデフォルト値を割り当てたい場合は、あなたが||=演算子を使用することができ、すなわち:

h = {some_key: 'non_default_value'} 
value = h[:some_key] ||= 'default_value' 
value2 = h[:non_existing_key] ||= 'default_value' 

value'non_default_value'value2意志が割り当てられます

:これらの割り当て h'default_value'

'default_value'からnon_existing_keyセットを持っていますが割り当てられ

{:some_key=>"non_default_value", :non_existing_key=>"default_value"}

関連する問題