2015-01-09 41 views
2

我需要修改的哈希值的特定按鍵,但我不希望添加的關鍵,如果它不存在,長版本將是:修改一個Ruby的哈希值僅如果存在

if my_hash.has_key?(:key) 
    my_hash[ :key ] = true if my_hash[ :key ] == 0 
    my_hash[ :key ] = false if my_hash[ :key ] == 1 
    # leave value alone if it is not 0 or 1 
else 
    # leave hash alone if key is not present 
end 

我想知道是否會有更優雅的解決方案。

+0

您只需要第二和第三行。 –

回答

6

也許與case聲明

case my_hash[:key]                                         
when 0; my_hash[:key] = true                                       
when 1; my_hash[:key] = false                                       
end 
+2

是的..爲什麼不呢? :) –

+0

這是有點不同於OP的代碼,它會設置值,如果鑰匙存在,但價值爲零。 –

+0

@PatrickOscity可能不理解你。剛剛測試過:如果'my_hash = {key:nil}',在這個塊之後它會像以前一樣成爲'nil'。 –

2

只是出於好奇:)

[0,1].include?(my_hash[:key]) && my_hash[:key] = my_hash[:key].zero? 
+0

這不會修改散列,它只是返回true或false。對? – wribln

+0

這是醜陋......... :) –

+0

@wribln當然它修改了散列。 – mudasobwa

0

一種方式可以使用的「映射」值的哈希值,然後遍歷正常的哈希和設置爲它的值

value_map = { 0 => true, 1 => false } 
my_hash.each { |k, v| my_hash[k] = value_map.include?(v) ? value_map[v] : v } 
+1

您希望映射所有鍵/值對的作品 - 不是特定的(如我的情況)。 – wribln

+0

每個人的身體都會爲單一的價值做到這一點。 –

+0

關鍵是你可以(甚至應該)使用散列來映射值,而不是控制流程語句。 –