2015-01-09 17 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

关键是你可以(甚至应该)使用散列来映射值,而不是控制流程语句。 –