这很好:
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
意思?
这很好:
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
意思?
return a or b
被解释为(return a) or b
,因此 的值return a
是计算 的值所必需的(return a) or b
,但由于return
永远不会留下一个值(因为它从那个位置逃逸),它的设计目的不是在原始位置返回一个有效值。因此整个表达式留下(some_void_value) or b
, 并被卡住。这就是它的意思。
在“ Ruby 中的某些运算符是否具有 `return` 的优先级? ”中,Stefan在评论中解释说or
andand
实际上是控制流运算符,不应该用作布尔运算符(||
和&&
分别)。
他还引用了“在 Ruby 中使用“与”和“或”:
and
并且or
起源于 Perl(就像 Ruby 一样)。在 Perl 中,它们主要用于修改控制流,类似于if
andunless
语句修饰符。(...)
他们提供了以下示例:
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 解释的a or b
表达式:
return a or b
具有低于其的优先级return a
,执行时转义当前上下文并且不提供任何值(void value)。然后这会触发错误(repl.it execution):
(repl):1: 无效值表达式
puts return a or b ^~
由于Stefan的评论,这个答案成为可能。
仅仅因为or
它的优先级低于||
之前return a
将执行的方法or b
,or b
因此是不可达的