2017-04-18 26 views
1

我有這個散列和數組,並執行以下命令哈希值的不存在的元素...如何返回一個字符串時,有一個使用數組

hash={"a"=>1,"b"=>2,"c"=>3,"d"=>4,"e"=>5,"f"=>6} 
array=["b","a","c","f","z","q"] 
print hash.values_at(*array).compact 

所以我希望它返回類似:

#=> [2,1,3,6,"invalid","invalid"] 

是否有聲明所有其它元件不存在於哈希值作爲「無效」的方式,不宣逐個(例如「G」 =>「無效」,「H」 => 「無效」)?

+1

是啊,剛剛成立'hash.default = 「無效」'。從[文檔](http://ruby-doc.org/core-2.0.0/Hash.html#method-i-default-3D) – Hamms

+0

[Initializing hashes]的可能重複(http://stackoverflow.com/questions/2990812 /初始化 - 散列) –

回答

3

如果一個散列必須響應一個不存在的鍵的默認值,那麼這個值必須被設置。通常它被設置散列的初始化:

hash = Hash.new("invalid") 

,但它可以隨時

hash={"a"=>1,"b"=>2,"c"=>3,"d"=>4,"e"=>5,"f"=>6} 
array=["b","a","c","f","z","q"] 

hash.default = "invalid" 
p hash.values_at(*array) #compact is superfluous 

# => [2, 1, 3, 6, "invalid", "invalid"] 
+0

請注意,這改變了'散列'。 –

3
array.map do |key| 
    hash.fetch key, 'invalid' 
end 

做如果fetch用一個參數調用,那麼如果該鍵不存在它會引發錯誤。然而,可選的第二個參數可以爲不存在的鍵設置自定義返回值。

這比hash.default=或在哈希構造函數中傳遞默認值的好處是哈希本身沒有改變,所以如果你將來查找不存在的鍵,它將返回nil而不是'無效'。

+0

很好的解釋。考慮提供一個指向文檔的鏈接[Hash#fetch](http://ruby-doc.org/core-2.4.0/Hash.html#method-i-fetch)。 –

2

試試這個:

array.map { |key| 
    hash.has_key?(key) ? hash[key] : 'invalid' 
} 
相關問題