为什么在Ruby中`返回a或b`是一个void值表达式错误?
这很好:
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
,并被卡住。 这就是它的意思。
仅仅因为or
具有比||
更低的优先级 这意味着return a
将在or b
or b
之前执行, or b
因此无法访问
从类似的问题我以前问,斯特凡在注释的解释or
和and
实际控制流量经营者 ,不应该被用来作为布尔运算符( ||
和&&
分别)。
他还引用了一篇文章,解释了这些控制流操作员背后的原因:
and
( or
源自Perl(如同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!"
因此,随着萨瓦在下面解释a or b
表达:
return a or b
优先级低于return a
,执行时会跳过当前上下文并且不提供任何值(空值)。 然后触发错误(repl.it执行):
(repl):1:void值表达式
puts return a or b
^~
由于Stefan的评论,这个答案成为可能(谢谢)。
链接地址: http://www.djcxy.com/p/25637.html上一篇: Why is `return a or b` a void value expression error in Ruby?
下一篇: Ruby on Rails Switch