每当X为真时做X,否则为Y.

问题描述 投票:0回答:2

以为我脑死了。当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
2个回答
0
投票

三元运算符怎么样?

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

3
投票

如果你正在使用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成为Hash中的值。如果你想允许nil值,那么使用带有第二个参数的fetch

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

因为你在Rails中,所以你可以将try放入混合中以吞下实例变量的nil值:

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

跟随to_i跟注是因为nil.try(m)是所有nilm。您也可以明确地调用#[]并避免第二次“返回此而不是引发异常”参数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在该表达式中的用途。

© www.soinside.com 2019 - 2024. All rights reserved.