我有一个简单的问题:
在红宝石中,如果我写
def test
foo && a == b && c == "bar"
end
如果foo为null或false,它会继续评估表达式的其余部分吗?
如果我这样做,它会改变什么
def test
a == b && c == "bar" if foo
end
非常感谢
答案 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