2

我们可以让下面的 Ruby 代码更短,同时更易读吗?

height = do_some_calc
height = 128 if height == 0
4

6 回答 6

7
height = 128 if 0 == height = do_some_calc

这是我知道的唯一方法,如果do_some_calc必须只评估一次。

于 2010-11-05T03:42:19.117 回答
2

如果您愿意更改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
于 2010-11-05T04:34:35.430 回答
1

更短?不是并且是功能性的。

  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
于 2010-11-05T03:52:36.673 回答
0

也许是这样的:

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更长的时间来缩短它。

于 2010-11-05T03:50:13.137 回答
0

您可以执行以下操作

height = do_some_calc.zero? ? 128 : do_some_calc 
于 2010-11-05T04:33:50.127 回答
-4

如果不是很可读,这在技术上更短:

(height = do_some_call) == 0 and height = 128

我会说保持它的方式,你的方式似乎是最简洁和可读的。

于 2010-11-05T04:35:19.613 回答