Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
仅当存在时修改Ruby哈希中的值_Ruby_Hash_Coding Style - Fatal编程技术网

仅当存在时修改Ruby哈希中的值

仅当存在时修改Ruby哈希中的值,ruby,hash,coding-style,Ruby,Hash,Coding Style,我需要修改特定键的散列值,但如果不存在该键,我不想添加该键,长版本将是: 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

我需要修改特定键的散列值,但如果不存在该键,我不想添加该键,长版本将是:

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

我想知道是否会有一个更优雅的解决方案。

也许可以使用
case
语句

case my_hash[:key]                                                                                                                                                                   
when 0; my_hash[:key] = true                                                                                                                                                         
when 1; my_hash[:key] = false                                                                                                                                                        
end
只是出于好奇:)


一种方法可能是使用“映射”值的散列,然后迭代普通散列并为其设置值

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

这与OP的代码有点不同,如果键存在,它会设置值,但值为零。@PatrickOscity可能不理解您的意思。刚刚测试:如果
my_hash={key:nil}
,在该块之后,它将是
nil
,与之前一样。@RustamA.Gasanov很抱歉,在这种情况下你是对的,这无关紧要。当
nil
是您可能要替换的有效值时,它很重要。这不会修改哈希,它只返回true或false。对吗?@mudosobwa你是对的:我在测试你的建议时犯了一个错误。@mudosobwa我花了一段时间才理解你的建议,我认为它看起来很鲁莽,但我很怀疑Kernighan和Ritchie是否会同意;-)你看过它前面的“出于好奇”吗?我肯定是通过@rustam-a-gasamovv对解决方案投了赞成票。你可以通过删除四个空格来缩短它。嘿,等一下!这不是!这样做的目的是为了映射一个全键/值对,而不是一个特定的键/值对(在我的例子中)。每个键/值对的主体将对单个值进行映射。关键是您可以(甚至应该)使用散列来映射值,而不是控制流语句。您只需要第二行和第三行。
value_map = { 0 => true, 1 => false }
my_hash.each { |k, v| my_hash[k] = value_map.include?(v) ? value_map[v] : v }