我在Ruby中有一个哈希:
hash = Hash.new
它有一些关键值对,比如说:
hash[1] = "One"
hash[2] = "Two"
如果哈希包含密钥2
,那么我想添加"香蕉"它的价值。如果哈希没有键2
,我想创建一个新的键值对2=>"Bananas"
。
我知道我可以通过首先使用2
检查哈希是否具有密钥has_key?
然后采取相应措施来执行此操作。但这需要if
语句和多行。
有没有一个简单,优雅的单行程来实现这个目标?
答案 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"}