Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么在Ruby中'returnA或b'是一个空值表达式错误?_Ruby_Return_Operator Precedence_Or Operator - Fatal编程技术网

为什么在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
              ^~