2014-11-20 3 views
1

Есть ли более короткий способ изменить значение ключа?Изменение значения ключа

my_array.each do |x| 
    if my_hash.key?(x) 
     my_hash[x] += 1 
    else 
     my_hash[x] = 1 
    end 
    end 
+1

возможно дубликат [Ruby: Что это самый простой способ для обновления значений Hash] (HTTP://stackoverflow.com/questions/5215713/ruby-what-is-the-easiest-method-to-update-hash-values) –

+0

@ Зелёный, что, если ключ не существует, будет ли он работать? –

+0

@AlexanderSupertramp: Проверьте мой ответ, если это то, что вы ищете. в противном случае дайте мне знать, поэтому я могу обновить свой ответ соответственно –

ответ

1

немного короче:

my_array.each do |x| 
    my_hash[x] ||= 0 
    my_hash[x] += 1 
end 
+0

, но я не хочу, чтобы оно было 0 по умолчанию. –

+1

Он не будет равен нулю, так как вы добавите 1 сразу после инициализации – ThomasSevestre

+0

Я не хочу, чтобы оно имело значение по умолчанию. –

1

В вашем конкретном случае это, вероятно, проще всего дать хэш-значение по умолчанию:

my_hash = Hash.new(1) 
=> {} 
my_hash[:x] 
=> 1 
my_hash[:y] += 1 
=> 2 

Обратите внимание, что это имеет смысл только если по умолчанию значение неизменно, в противном случае ссылка будет использоваться всеми ключами.

+0

Как может y быть равным 2? –

+0

Поскольку у него было значение по умолчанию 1. Если вы этого не хотите, инициализируйте хэш с помощью 'Hash.new (0)'. –

+0

Я не хочу, чтобы оно имело значение по умолчанию. Я хочу повысить ценность. –

0

Вы можете использовать тернарный оператор для написания вашего заявления на одной строке.

my_array.each {|x| my_hash.key?(x) ? my_hash[x].next : my_hash[x] = 1} 

Вы также можете использовать следующий методесли вы увеличиваете значение, только 1.

Смежные вопросы