【问题标题】:Whenever X is true do X, otherwise Y每当 X 为真时做 X,否则做 Y
【发布时间】:2014-08-14 03:13:36
【问题描述】:

以为我脑死了。当 X 存在时(哈希中指定键的值),我需要一种非常简洁的书写方式,打印该值(即 X),否则,打印 0。它需要简洁的原因是因为我正在使用它在options 中为form_tag,我想避免编写方法。

想不通...这是我尝试过的:

  1. 这行不通,因为它总是返回“0”:<%= number_field_tag "transaction[][#{thing}]", :quantity, min: 0, placeholder: 0 || @transactionparams["#{thing}"] %>

  2. 这不起作用,因为每当@transactionparams 不存在时,我得到的不是0,而是一个错误未定义的方法[]' for nil:NilClass`

【问题讨论】:

    标签: ruby-on-rails ruby hash operators comparator


    【解决方案1】:

    如果您使用的是 Ruby 2+,则可以利用 nil.to_h 是一个空哈希这一事实:

    v = @transactionparams.to_h[:thing] || 0
    

    您还可以利用 nil.to_i 为零:

    v = @transactionparams.to_h[:thing].to_i
    

    请注意,Rails 会修补 NilClass#to_h 以返回一个空的 Hash,因此即使您不在 Ruby 2+ 中也可以使用。

    这些假设您不希望 nil 成为哈希中的值。如果您想允许 nil 值通过,请使用 fetch 和第二个参数:

    v = @transactionparams.to_h.fetch(:thing, 0)
    

    由于您在 Rails 中,您可以将 try 放入混合中以吞下实例变量的 nil 值:

    v = @transactionparams.try(:fetch, :thing, 0).to_i
    

    尾部的to_i 调用存在,因为对于所有mnil.try(m)nil。你也可以显式调用#[],避免Hash#fetch的第二个“返回这个而不是引发异常”参数:

    v = @transactionparams.try(:[], :thing).to_i
    

    您可以根据您希望在@transactionparams 中具有什么样的值以及您需要如何具体处理nils 来混合和匹配上述内容。在大多数情况下,我可能会选择to_hto_i

    @transactionparams.to_h[:thing].to_i
    

    我倾向于使用.to_X 方法(尤其是#to_a)一直隐藏nil 检查,因此我会立即认识到to_hto_i 在该表达式中的用途。

    【讨论】:

    • 这是另一种很棒的方法。好提示!我会选择@kreek 的答案,因为那里的代码在我的大脑中读起来更合乎逻辑......我会立即理解意图,而这个,因为它依赖于 Ruby 的技巧之一,我不得不考虑。不过谢谢!
    • 不用担心。就像我说的,我一直使用这种方法,所以这是我的第二天性。
    【解决方案2】:

    三元运算符怎么样?

    @transactionparams = {:thing => "foo"}
    puts @transactionparams ? @transactionparams[:thing] : 0
    @transactionparams = nil 
    puts @transactionparams ? @transactionparams[:thing] : 0
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-14
      • 2012-06-18
      • 1970-01-01
      • 1970-01-01
      • 2022-07-12
      • 2012-02-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多