2013-11-22 15 views
0

我有几次发现自己需要在某些ruby脚本中编写一个相当详细的if语句。Ruby整数值和整数值的评估

声明会是这个样子:

if long_var_name == 0 && very_different_name == 0 && other_third_var == 0 && additional_variable == 0 && name_five == 0 && longest_variable_name_six == 0 
    # (possibly even more conditions) 
    # do stuff here... 
end 

好像必须有一个更优雅的方式来做到这一点。

问题是,ifand是不是很容易与谷歌研究,作为基本的英文单词。所以我已经空手而归了。

有没有人知道一种方法来缩短这种情况? 当你有更多的时候,它可能成为一个噩梦。

  • 有时变量重命名不是一个选项。
  • 这些名称有时大不相同。

注:我发现了类似的情况有一个聪明的解决方案或者:

Ruby Multiple OR Evaluations For String Value

+0

不坏的问题,恕我直言。 Upvote;) –

+0

谢谢。我不想听起来很讨厌,但我看到很多其他人的好问题都被低估了 - 我认为我们这些试图回答很多问题的人忘了在我们有时候会上瘾。 (我敢肯定我也很内疚)(并且总是有鲨鱼) – Plasmarob

回答

6

如果你有一个数组和零专门测试,你可以这样做:

vars1 = [0,0,3,0,0] 
vars2 = [0,0,0,0,0] 

vars1.all?(&:zero?) # false 
vars2.all?(&:zero?) # true 

编辑:基于OP的添加条件,其值为不同的名称:

if [long_var_name_1,long_var_name_2,long_var_name_3].all?(&:zero?) 
    # do stuff here... 
end 
+0

这是正确的答案。 –

+0

这与同类答案本质上不同,但我喜欢将'Proc'传递给'all?'!给予好评。 –

+0

非常干净,直接点。感谢我和鞋匠。 – Plasmarob

1

在特定情况下,我会写

if [a, b, c, d, e, f].all? { |var| var == 0 } 

有提错了链接and条件恕我直言。

+0

'和'没有严重问题。我只是不在乎它可以得到多么混乱。我曾经有过三条线。 – Plasmarob

+1

具有异常多的条件可能是您需要重构代码的标志。 –

+0

有时它的代码我没有重构的权限,但这是一个很好的观点。我曾考虑过在某些情况下写一个包装,因为这是我所能想到的 - 在我的结尾使它更清洁。 – Plasmarob

0

您可以使用方法的Enumerable#all?Symbol#to_proc利用率。

foo = 0 
bar = 0 
baz = 0 

[foo, bar, baz].all? &:zero? 
# => true 

one = 1 
two = 2 

[foo, one, two].any? &:zero? 
#=> true 

请注意,您也可以为测试提供任何匿名函数。

owns_peanuts = ->(person){ person.inventory.contains :peanuts } 
[bill, david, mike].any? &owns_peanuts 
+0

已经回答了.. :) –

+1

可以说,答案没有提及,但没有提及哪些方法实际上被调用,因为它只会显示为Ruby魔法。每个人都有自己的想法:-) –

1

你有没有想过把它分解成逻辑表达式?基本上将其分解成更小的逻辑分组,并且更易于阅读,例如,

grp_1_zero = var_1 == 0 && var_2 == 0 && var_3 == 0 
grp_2_zero = var_a == 0 && var_b == 0 && var_c == 0 
grp_3_zero = var_z == 0 && var_x == 0 && var_y == 0 

if grp_1_zero && grp_2_zero && grp_3_zero 
    #code here 
end 
+0

这绝对值得考虑。我可能在某个时候需要这个。 – Plasmarob

1

另外,对于阵列a

a == Array.new(a.size,0) 
+0

没有必要实例化整个其他数组,但是。你应该编辑这篇文章,以包含这个事实,即允许其他可能性。 +给予好评! – Plasmarob

+0

我不主张这一点,只是认为这值得一提。 '呢?零?'显然是要走的路。 –