Why is `return a or b` a void value expression error in Ruby?
这很好:
1 2 3 | def foo a or b end |
这也很好:
1 2 3 | def foo return a || b end |
返回
1 2 3 | def foo return a or b end |
为什么?它甚至没有被执行;它没有通过语法检查。
在我之前问过的一个类似问题中,Stefan在评论中解释说,
他还引用了一篇文章来解释这些控制流操作符背后的推理:
and andor originate (like so much of Ruby) in Perl. In Perl, they were largely used to modify control flow, similar to theif andunless statement modifiers. (...)
它们提供了以下示例:
1 foo = 42 && foo / 2This will be equivalent to:
1 foo = (42 && foo) / 2 # => NoMethodError: undefined method `/' for nil:NilClass
目标是给
1 foo = 42 and foo / 2 # => 21
它还可以作为循环中的反向
1 next if widget = widgets.pop
相当于:
1 widget = widgets.pop and next
useful for chaining expressions together
如果第一个表达式失败,则执行第二个表达式,依此类推:
1 foo = get_foo() or raise"Could not find foo!"
它还可以用作:
reversed
unless statement modifier:
1 raise"Not ready!" unless ready_to_rock?
相当于:
1 ready_to_rock? or raise"Not ready!"
因此,正如sawa解释的,
1 return a or b
优先级低于
(repl):1: void value expression
1
2 puts return a or b
^~
由于Stefan的评论(谢谢),这个答案成为可能。
由于