我们可以让下面的 Ruby 代码更短,同时更易读吗?
height = do_some_calc
height = 128 if height == 0
我们可以让下面的 Ruby 代码更短,同时更易读吗?
height = do_some_calc
height = 128 if height == 0
height = 128 if 0 == height = do_some_calc
这是我知道的唯一方法,如果do_some_calc
必须只评估一次。
如果您愿意更改do_some_calc
为返回 false 或 nil 而不是 0,那么您就是在做生意。
height = do_some_calc || 128
如果您无法将 do_some_calc 更改为在通常返回 0 时返回 false 或 nil,那么您可以包装它,但从长远来看,您不会保存很多字符。除了在很多地方设置默认值的情况。
如果 do_some_calc 返回 0 并且在所有其他情况下 do_some_calc 的输出,则此包装器将返回 false。
def my_do_some_calc
temp = do_some_calc
temp != 0 && temp
end
把它们放在一起给出:
height = my_do_some_calc || 128
更短?不是并且是功能性的。
height = (h = do_some_calc).zero? ? 128 : h
如:
def do_some_calc
rand 100
end
10.times do
height = (h = do_some_calc).zero? ? 128 : h
puts height
end
# >> 3
# >> 95
# >> 89
# >> 82
# >> 31
# >> 4
# >> 82
# >> 99
# >> 11
# >> 64
也许是这样的:
STANDARD_HEIGHT = 128
def do_some_calc
height = 0
#calculate our height...
height = height == 0 ? STANDARD_HEIGHT : calculated_height
end
我认为需要给 更多的上下文128
,因此是常数。我还认为do_some_calc
应该隐藏这样一个事实,即如果它确实等于 0,它真的应该等于我们的DEFAULT_HEIGHT
.
编辑:要回答您隐含的问题(我已经编辑过),我们可以通过do_some_calc
更长的时间来缩短它。
您可以执行以下操作
height = do_some_calc.zero? ? 128 : do_some_calc
如果不是很可读,这在技术上更短:
(height = do_some_call) == 0 and height = 128
我会说保持它的方式,你的方式似乎是最简洁和可读的。