这很好:
def foo
a or b
end
这也没关系:
def foo
return a || b
end
这会返回void value expression
:
def foo
return a or b
end
为什么呢?它甚至没有被执行;它没有通过语法检查。 void value expression
是什么意思?
答案 0 :(得分:12)
return a or b
被解释为(return a) or b
,因此return a
的值是计算(return a) or b
的值所必需的,但由于return
永远不会离开值到位(因为它从该位置逃逸),它不是设计为在原始位置返回有效值。因此整个表达式都留有(some_void_value) or b
,并且被卡住了。这就是它的意思。
答案 1 :(得分:3)
我之前提到的similar question,Stefan在评论中解释说or
和and
实际上是控制流操作符,应该不能用作布尔运算符(分别为||
和&&
)。
他还引用了article that explains the reasoning behind these control flow operators:
在Perl中,
and
和or
起源于(就像Ruby一样)。在Perl中,它们主要用于修改控制流,类似于if
和unless
语句修饰符。 (...)
他们提供以下示例:
and
foo = 42 && foo / 2
这相当于:
foo = (42 && foo) / 2 # => NoMethodError: undefined method `/' for nil:NilClass
目标是为foo
分配一个数字,并将其重新分配给其值的一半。因此,and
运算符在此处非常有用,因为它的优先级较低,它会修改/ 控制各个表达式的正常流:
foo = 42 and foo / 2 # => 21
它也可以在循环中用作反向if
语句:
next if widget = widgets.pop
相当于:
widget = widgets.pop and next
or
用于将表达式链接在一起
如果第一个表达式失败,请执行第二个表达式,依此类推:
foo = get_foo() or raise "Could not find foo!"
它也可以用作:
反向
unless
语句修饰符:raise "Not ready!" unless ready_to_rock?
相当于:
ready_to_rock? or raise "Not ready!"
因此sawa explained a or b
表达式为:{/ p>
return a or b
优先级低于return a
,执行时会转义当前上下文并且不提供任何值( void value )。然后,这会触发错误(repl.it execution):
(repl):1:无效值表达
puts return a or b ^~
由于Stefan comments(谢谢),这个答案成为可能。
答案 2 :(得分:2)
只是因为or
有lower precedence而非||
,这意味着return a
将在or b
之前执行,因此or b
无法访问