我有此声明:
> 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行中做得很优雅。
我该怎么做?
您确实在标题和问题中都有解决方案(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
但是,请注意,没有这些与第一个版本一样可读且清晰。
此外,请注意,您问题中的描述与问题中的代码不匹配,因为代码不符合您在问题中所描述的。