【问题标题】:Adding a key only to a hash based on an if statement仅将键添加到基于 if 语句的哈希
【发布时间】:2010-08-28 23:10:56
【问题描述】:

通常,我们将哈希定义为

h={:a=>val1, :b=>val2}

但是,如果 val2 不是 nil 值,我想添加一个条件以仅添加键 :b。类似的东西

h={:a=>val1}
h[:b]=val2 if val2

但是可以封装成一行吗?

【问题讨论】:

  • 我看不出有什么好的理由在一行上这样做,除非你的显示器有半英寸高。

标签: ruby refactoring


【解决方案1】:
h = { :a => val1 }.merge(val2 ? { :b => val2 } : {})

但不要这样做。保持简单。

【讨论】:

    【解决方案2】:

    您不必担心哈希中的 nil 元素,因为您可以简单地从它们中清除哈希:

    {:a => 1, :b => nil}.reject { |k, v| v.nil? } # {:a => 1}
    

    【讨论】:

    • 但看起来 OP 想要 [:a] 在那里,即使它的值为 nil。
    【解决方案3】:
    h[:b] = val unless val.nil?
    

    【讨论】:

    • 我想我的意思是担心在一行中完成它是愚蠢的。谁在乎?担心真正的问题。
    【解决方案4】:

    从 ruby​​ 2.4 开始,您可以使用 Hash#compact

    h = { a: 1, b: false, c: nil }
    h.compact     #=> { a: 1, b: false }
    h             #=> { a: 1, b: false, c: nil }
    

    【讨论】:

      【解决方案5】:

      您可以只为那个哈希覆盖 []= 运算符,或者创建一个 Hash 的子类并在那里覆盖它。

      hash = {}
      
      class << hash
        def []=(key, value)
          case key
          when :b
            raise StandardError("Invalid :b value") if value.nil?
          end
      
          super(key,value)
        end
      end
      
      hash[:a] = 10
      hash[:b] = nil  # Will raise exception
      

      【讨论】:

      • 现在这太复杂了,但是对于未来有这种需求的项目来说会很棒,谢谢!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多