[英]Ruby Multiple AND Evaluations For Integer Value
在某些情况下,我发现自己需要在一些ruby脚本中编写相当冗长的if语句。
该语句如下所示:
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
似乎必须有一种更优雅的方法来执行此操作。
问题是, if
和and
都不是很容易用Google研究的基本英语单词。 所以我空手而归。
有谁知道一种缩短这种情况的方法? 当您阅读更多书籍时,这可能会成为一场噩梦。
注意:在OR的类似情况下,我找到了一个聪明的解决方案:
如果您有一个数组并且专门测试零,则可以执行以下操作:
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
在您的特定情况下,我会写
if [a, b, c, d, e, f].all? { |var| var == 0 }
恕我直言,关于链接and
条件存在错误。
您是否考虑过将其分解为逻辑表达式? 基本上将其分解为较小的逻辑分组,并且更易于阅读,例如
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
另一个,对于数组a
:
a == Array.new(a.size,0)
您可以使用Enumerable#all?
和Fixnum#zero?
的Symbol#to_proc
利用率Fixnum#zero?
方法。
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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.