仅当存在时修改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 }