如果返回的值是0,在1行中如何优雅地返回1.0?

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

我有此声明:

> zv.sum(:volume).to_f || 1.0
   (0.5ms)  SELECT SUM("positions"."volume") FROM "positions" WHERE "positions"."volume" = $1  [["volume", 0]]
=> 0.0

我想发生的是,如果zv.sum(:volume)返回0.0,我希望它返回1.0

我知道我可以做一个冗长的if / unless语句,但是我想在上面的1行中做得很优雅。

我该怎么做?

ruby ruby-on-rails-5
1个回答
0
投票

您确实在标题和问题中都有解决方案(bold强调我的意思:

如何优雅地返回1.0 if在1行中返回的值为0?

我想发生的是如果zv.sum(:volume)返回0.0,我希望它改为返回1.0

所以,最好的方法是使用条件表达式

sum = zv.sum(:volume).to_f

if sum == 0.0
  1.0
else
  sum
end
在Ruby中,

在1行中完成某项操作的要求总是可以轻易实现,因为换行符始终是可选的。例如:

sum = zv.sum(:volume).to_f; if sum == 0.0 then 1.0 else sum end

如果需要单个表达式,可以将变量赋值内联到条件中:

if (sum = zv.sum(:volume).to_f) == 0.0
  1.0
else
  sum
end

当然,您可以将两者结合起来:

if (sum = zv.sum(:volume).to_f) == 0.0 then 1.0 else sum end

如果您不介意一些稍微复杂的非本地控制流,则可以执行以下操作:

zv.sum(:volume).to_f.tap {|sum| break 1.0 if sum == 0.0 }

此外,如果您知道总和的一些特殊之处,例如,如果您知道总和总是正好为0或大于1,那么您可以利用这些额外的知识,并可以执行以下操作:

[1, zv.sum(:volume)].max.to_f

但是,请注意,没有这些与第一个版本一样可读且清晰。

此外,请注意,您问题中的描述与问题中的代码不匹配,因为代码不符合您在问题中所描述的。

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