评估多种条件

时间:2016-11-20 21:04:47

标签: ruby

我有一个简单的问题:

在红宝石中,如果我写

def test
  foo && a  == b && c == "bar"
end

如果foo为null或false,它会继续评估表达式的其余部分吗?

如果我这样做,它会改变什么

def test
  a == b && c == "bar" if foo
end

非常感谢

2 个答案:

答案 0 :(得分:4)

理论

&&是一个惰性运算符,就像||一样。

这意味着在a && b中,如果a为false或nil,则Ruby无法检查b,因为a && b将为false / nil无论如何

实际上需要这种行为,因为它可以节省时间并且可以避免NoMethodErrors。

if a && method_which_requires_a_non_nil_parameter(a)
  # ...
end
如果method_which_requires_a_non_nil_parameter为零,则

a根本不会被调用。

或:

x = x || long_method_to_calculate_x

通常用于缓存,更常用于:

@x ||= long_method_to_calculate_x

答案

def test
  foo && a  == b && c == "bar"
end

如果foo为nil或false,则不会评估表达式的其余部分: a,b,c甚至可以在不引发NameError的情况下被定义。

def test
  a == b & c == "bar" if foo
end
  • 如果foo真实,结果将完全相同。

  • 如果foo为nil或false,则不会评估2个等式,就像第一个例子一样。但是:

    • 如果foo为nil,则两个测试都将返回nil。

    • 如果foo为false,则第一个示例将返回false,第二个示例将返回nil。

答案 1 :(得分:1)

"如果foo为null或false,它会继续评估表达式的其余部分吗?" 不,它不会

此表可以帮助您解决此类问题:

下表根据降序优先级排序(最高优先级在顶部)

N A M  Operator(s)            Description
- - -  -----------            -----------
1 R Y  ! ~ +                  boolean NOT, bitwise complement, unary plus
                              (unary plus may be redefined from Ruby 1.9 with +@)

2 R Y  **                     exponentiation
1 R Y  -                      unary minus (redefine with -@)

2 L Y  * / %                  multiplication, division, modulo (remainder)
2 L Y  + -                    addition (or concatenation), subtraction

2 L Y  << >>                  bitwise shift-left (or append), bitwise shift-right
2 L Y  &                      bitwise AND

2 L Y  | ^                    bitwise OR, bitwise XOR (exclusive OR)
2 L Y  < <= >= >              ordering

2 N Y  == === != =~ !~ <=>    equality, pattern matching, comparison
                              (!= and !~ may not be redefined prior to Ruby 1.9)

2 L N  &&                     boolean AND
2 L N  ||                     boolean OR

2 N N  .. ...                 range creation (inclusive and exclusive)
                              and boolean flip-flops

3 R N  ? :                    ternary if-then-else (conditional)
2 L N  rescue                 exception-handling modifier

2 R N  =                      assignment
2 R N  **= *= /= %= += -=     assignment
2 R N  <<= >>=                assignment
2 R N  &&= &= ||= |= ^=       assignment

1 N N  defined?               test variable definition and type
1 R N  not                    boolean NOT (low precedence)
2 L N  and or                 boolean AND, boolean OR (low precedence)
2 N N  if unless while until  conditional and loop modifiers