如果值存在,则返回该值

4
在Ruby on Rails中,有更好的方式来编写这个吗:
qty = 2
avg_price = room["price"].to_f if room["price"].present?
total_price = (avg_price * qty) if avg_price.present?

尤其是第二行和第三行。我发现自己经常使用if-else条件语句。谢谢。

当它们不是“存在”时,您希望它们为nil吗?或者它们可以是00.0吗? - sawa
@sawa,如果不存在的话,它应该是nil。 - Victor
您是否实际上可能有像""这样的值?如果没有,您就不需要present?。特别是,您明显不需要在第三行中使用它。 - sawa
4个回答

0
你可以尝试这样做:
qty = 2
total_price = room.fetch("price").to_f * qty

但是这个代码存在一个问题,如果哈希表中没有price字段,它将会引发异常。是否满足您的需求?


我需要它返回nil。不能抛出异常。 - Victor
另一种方法 - 通过 rescue 来设置 total_price 为 nil =)rescue total_price = nil - uno_ordinary
谢谢,但这是在视图中使用的。不想在视图中有太多逻辑。 - Victor
或者,你可以这样写:total_price = room["price"] ? hash["price"].to_f*qty : nil - uno_ordinary

0

很难把这个变得更短,我只会这样写:

qty, avg_price, total_price = 2, nil, nil

if room["price"]
  avg_price   = Float(room["price"])
  total_price = avg_price * qty
end

0
定义一个辅助方法,以便您可以直接从哈希中提取浮点数:
class Hash
  def get_f key; fetch(key).to_f if key?(key) end # Or `if self[key].present?`
end

然后执行:

qty = 2
avg_price = room.get_f("price")
total_price = avg_price * qty if avg_price

0
也许更加面向对象的方法会更好?这种方法使得代码测试更容易,并且可以重复使用。
class PriceCalculator

  def init(quantity, price)
    @quantity = quantity
    @price    = price.presence && price.to_f
  end

  def total
    @price * @quantity  if @price
  end

end

total_price = PriceCalculator.new(2, room["price"]).total

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接