2015-05-06 4 views
3

Есть ли общий рубин идиома для этого кода:рубин идиома для обновления или вставки HashMap

if hashmap.has_key?(key) 
    hashmap[key] += 1 
else 
    hashmap[key] = 1 
end 

Такое ощущение, что там может быть высокая функция порядка, которая помогает здесь. Я надеюсь, что-то вроде

hashmap[key].insertOrUpdate { 1 }, {|value| value += 1} 

Edit: Хотя @ ответ Santhosh является прохладным и работает с моим конкретным примером, я более заинтересован в общем случае. Я думаю, что ответ @ Савва дает большую гибкость в качестве кодового блока передается в возможности сложной логики, как хэш хэша и т.д. ...

ответ

0

Вместо того, что вы сделали, лучше путь:

hashmap = Hash.new{|h, k| h[k] = 0} 

Тогда вам только нужно сделать:

hashmap[key] += 1 
+2

Я не следую. После определения 'hashmap',' hashmap ['cat'] # => 2'. –

+0

В этом случае по умолчанию должно быть 0, чтобы соответствовать моему примеру, но общая идея хорошая и именно то, что я искал. – thisisdog

+0

Извините. Это должно быть «0», как указал Кэри. – sawa

1

Вы можете написать:

hashmap = {} 
key = 'cat' 
hashmap[key] = (hashmap[key] || 0) + 1 #=> 1 
hashmap[key] = (hashmap[key] || 0) + 1 #=> 2 
+0

или 'HashMap [ключ] .to_i + 1', так как' nil.to_i' равен нулю. –

+0

Ницца, мне нужно это запомнить. Спасибо, μ. –

+0

'nil.to_a' и' nil.to_h' также полезны для преобразования 'nil' в "пустые" вещи. –

2

вы можете воспользоваться из Дело в том, что nil.to_i является 0

hashmap[key] = hashmap[key].to_i + 1 
2

Вы можете использовать fetch, чтобы обеспечить значение по умолчанию:

hashmap[key] = hashmap.fetch(key, 0) + 1 
Смежные вопросы