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

问题描述 投票:5回答:5

我在Ruby中有一个哈希:

hash = Hash.new

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

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

如果哈希包含密钥2,那么我想在其值中添加“Bananas”。如果哈希没有密钥2,我想创建一个新的密钥值对2=>"Bananas"

我知道我可以通过首先使用2检查散列是否具有密钥has_key?,然后相应地采取行动。但这需要一个if声明和多行。

那么有一个简单,优雅的单线程来实现这一目标吗?

ruby hash hashmap
5个回答
9
投票

这有效:

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

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

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

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

4
投票

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

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

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

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

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"


0
投票

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

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

{1=>"One", 2=>"TwoBananas"}
© www.soinside.com 2019 - 2024. All rights reserved.