【问题标题】:Modify a value in a Ruby hash only if present仅在存在时修改 Ruby 哈希中的值
【发布时间】:2015-01-09 14:59:46
【问题描述】:

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

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

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

【问题讨论】:

  • 你只需要第二行和第三行。

标签: ruby hash coding-style


【解决方案1】:

也许有case 声明

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

【讨论】:

  • 这与OP的代码有点不同,如果key存在但值为nil,它将设置值。
  • @PatrickOscity 可能不了解您。刚刚测试:如果my_hash = {key: nil},在这个块之后它将像以前一样是nil
  • @RustamA.Gasanov 对不起,在这种情况下你是对的,没关系。当nil 是您可能想要替换的有效值时,这很重要。
【解决方案2】:

只是出于好奇:)

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

【讨论】:

  • 这不会修改哈希,它只是返回真或假。对吗?
  • @mudosobwa 你是对的:我在测试你的建议时出错了。
  • @mudsosobwa 我花了一段时间才理解你的建议,我认为它看起来很红,但我非常怀疑 Kernighan 和 Ritchie 是否会批准 ;-)
  • 你见过前面的“只是出于好奇”吗?我绝对赞成@rustam-a-gasamov 的解决方案
  • 您可以通过删除四个空格来缩短它。嘿,等一下!这不是Code Golf
【解决方案3】:

一种方法可能是使用“映射”值的散列,然后遍历您的正常散列并为其设置值

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

【讨论】:

  • 你想要映射所有键/值对的工作 - 而不是特定的一对(如我的情况)。
  • 每个的主体都会为单个值执行此操作。
  • 重点是您可以(甚至应该)使用散列来映射值,而不是控制流语句。
猜你喜欢
  • 2016-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-12
  • 2012-11-24
  • 1970-01-01
  • 2014-04-09
  • 2013-09-26
相关资源
最近更新 更多