为什么在Ruby中'returnA或b'是一个空值表达式错误?
这很好:为什么在Ruby中'returnA或b'是一个空值表达式错误?,ruby,return,operator-precedence,or-operator,Ruby,Return,Operator Precedence,Or Operator,这很好: def foo a or b end 这也很好: def foo return a || b end 这将返回无效值表达式: def foo return a or b end 为什么??它甚至没有被执行;它没有通过语法检查。无效值表达式是什么意思?返回a或b被解释为(返回a)或b,因此返回a的值是计算(返回a)或b的值所必需的,但由于返回从不保留值(因为它从该位置逃逸),它不是为在原始位置返回有效值而设计的。因此,整个表达式保留有(一些无效值)或b,并被卡住。这就是
def foo
a or b
end
这也很好:
def foo
return a || b
end
这将返回无效值表达式:
def foo
return a or b
end
为什么??它甚至没有被执行;它没有通过语法检查。无效值表达式是什么意思?返回a或b被解释为
(返回a)或b
,因此返回a的值是计算(返回a)或b
的值所必需的,但由于返回
从不保留值(因为它从该位置逃逸),它不是为在原始位置返回有效值而设计的。因此,整个表达式保留有(一些无效值)或b
,并被卡住。这就是它的意思。仅仅是因为或比|
更重要,这意味着返回的a
将在或b
之前执行,或b
因此在我询问的“”中是无法到达的,注释中解释了或
和和
实际上是控制流运算符,不应用作布尔运算符(|
和&
)
他还提到了“”:
和
和或
起源于Perl(就像Ruby中的很多东西一样)。在Perl中,它们主要用于修改控制流,类似于if
和除非语句修饰符。(……)
它们提供了以下示例:
和
这相当于:
foo = (42 && foo) / 2 # => NoMethodError: undefined method `/' for nil:NilClass
目标是为foo
分配一个数字,并将其值的一半重新分配给它。因此,和
运算符在这里很有用,因为它的优先级较低,它修改/控制单个表达式的正常流:
它也可以用作循环中的反向if
语句:
这相当于:
foo = (42 && foo) / 2 # => NoMethodError: undefined method `/' for nil:NilClass
或
用于将表达式链接在一起
如果第一个表达式失败,则执行第二个表达式,依此类推:
它还可以用作:
反向除非
语句修饰符:
raise "Not ready!" unless ready_to_rock?
这相当于:
foo = (42 && foo) / 2 # => NoMethodError: undefined method `/' for nil:NilClass
因此,作为中的a或b
表达式:
优先级低于返回一个
,当执行时,它将转义当前上下文,并且不提供任何值(void值)。然后触发错误():
(repl):1:void值表达式
puts return a or b
^~
此答案之所以可能是因为。这不是重复的答案。我已经删除了对|
操作符的所有引用,问题仍然存在。请重新打开。@Yvette小姐对不起,我应该考虑到这一点。但是,我希望它仍然可以显示标记为的重复项的问题不能回答我的问题。@muistooshort为什么将此标记为重复项?我看到了那个问题,但它没有回答我的问题,但萨瓦的回答回答了。我把它看作是另一个优先问题(事实就是这样),但也许我太苛刻了,所以我会重新开始。
foo = get_foo() or raise "Could not find foo!"
raise "Not ready!" unless ready_to_rock?
ready_to_rock? or raise "Not ready!"
return a or b
puts return a or b
^~