如果密钥存在,添加一些哈希值?

时间:2014-03-24 15:48:51

标签: ruby hash hashmap

我在Ruby中有一个哈希:

hash = Hash.new

它有一些关键值对,比如说:

hash[1] = "One"
hash[2] = "Two"

如果哈希包含密钥2,那么我想添加"香蕉"它的价值。如果哈希没有键2,我想创建一个新的键值对2=>"Bananas"

我知道我可以通过首先使用2检查哈希是否具有密钥has_key?然后采取相应措施来执行此操作。但这需要if语句和多行。

有没有一个简单,优雅的单行程来实现这个目标?

5 个答案:

答案 0 :(得分:9)

这有效:

hash[2] = (hash[2] || '') + 'Bananas'

如果您希望所有键都以这种方式运行,您可以使用Ruby的哈希的“默认”功能:

hash = {}
hash.default_proc = proc { '' }
hash[2] += 'Bananas'

答案 1 :(得分:4)

(hash[2] ||= "").concat("Bananas")

答案 2 :(得分:4)

您可以将哈希的默认值设置为空字符串,然后使用<<运算符以连接传递的任何新值:

h = Hash.new("")
#=> {}
h[2] << "Bananas"
#=> "Bananas" 
h
#=> {2=>"Bananas"} 
h[2] << "Bananas"
#=> "BananasBananas" 

Per @ rodrigo.garcia的评论,这种方法的另一个副作用是Hash.new()设置哈希的默认返回值(可能是也可能不是你想要的)。在上面的示例中,该默认值为空字符串,但不一定是:

h2 = Hash.new(2)
#=> {}
h2[5] 
#=> 2

答案 3 :(得分:1)

从技术上讲,你的道路都通往同一个地方。因此,Hash[2] = "bananas"产生的结果与首先检查密钥2的哈希值相同。但是,如果由于某种原因确实需要检查哈希值的过程,那么使用.has_key?方法就可以了,一个基本的if条件。

假设有一个哈希,

`Hash = { 1 => "One", 2 => "Two" }`

根据密钥搜索的真值设置一个代码块,

if hash.has_key?(2) == true hash[2] = "bananas" else hash[2] = "bananas" end

或更简单地说,

hash.has_key?(2) == true ? hash[2] = "bananas" : hash[2] = "bananas"

答案 4 :(得分:0)

您可以使用块初始化哈希,然后直接连接:

hash = Hash.new {|hash, key| hash[key] = ""}
hash[1] << "One"
hash[2] << "Two"
hash[2] << "Bananas"

{1=>"One", 2=>"TwoBananas"}