我在Ruby中有一个哈希:
hash = Hash.new
它有一些关键的价值对,比如说:
hash[1] = "One"
hash[2] = "Two"
如果哈希包含密钥2
,那么我想在其值中添加“Bananas”。如果哈希没有密钥2
,我想创建一个新的密钥值对2=>"Bananas"
。
我知道我可以通过首先使用2
检查散列是否具有密钥has_key?
,然后相应地采取行动。但这需要一个if
声明和多行。
那么有一个简单,优雅的单线程来实现这一目标吗?
这有效:
hash[2] = (hash[2] || '') + 'Bananas'
如果您希望所有键都以这种方式运行,您可以使用Ruby的哈希的“默认”功能:
hash = {}
hash.default_proc = proc { '' }
hash[2] += 'Bananas'
(hash[2] ||= "").concat("Bananas")
您可以将散列的默认值设置为空字符串,然后使用<<运算符来连接传递的任何新值:
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
从技术上讲,你的道路都通往同一个地方。因此,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"
您可以使用块初始化哈希,然后直接连接:
hash = Hash.new {|hash, key| hash[key] = ""}
hash[1] << "One"
hash[2] << "Two"
hash[2] << "Bananas"
{1=>"One", 2=>"TwoBananas"}