这很好:
def foo
a or b
end
这也是可以的:
def foo
return a || b
end
这将返回void值表达式
:
def foo
return a or b
end
为什么?它甚至没有执行;它未通过语法检查。"void value expression
"是什么意思?
这很好:
def foo
a or b
end
这也是可以的:
def foo
return a || b
end
这将返回void值表达式
:
def foo
return a or b
end
为什么?它甚至没有执行;它未通过语法检查。"void value expression
"是什么意思?
return a or b
被解释为 (return a) or b
,因此需要计算(return a) or b
的值,必须要先知道return a
的值。但由于return
语句不在原位置返回有效值(因为它从该位置跳出),所以设计上不能在原位置上返回有效值。因此表达式被卡在了 (some_void_value) or b
,无法运行。这就是它的含义。
or
和and
实际上是控制流运算符,不应作为布尔运算符(分别使用||
和&&
)。他们提供了以下示例:
and
和or
(就像Ruby中的很多东西一样)源自Perl。在Perl中,它们主要用于修改控制流,类似于if
和unless
语句修饰符。 (...)
and
foo = 42 && foo / 2
This will be equivalent to:
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
或
用于将表达式连接在一起
如果第一个表达式失败,则执行第二个表达式,以此类推:
它也可作为以下用途之一:foo = get_foo() or raise "Could not find foo!"
reversed
unless
statement modifier:raise "Not ready!" unless ready_to_rock?
这相当于:
因此,正如a或b:ready_to_rock? or raise "Not ready!"
return a or b
比 return a
优先级低,当执行时,return a
会跳出当前上下文并且不提供任何值(空值)。这就触发了错误 (repl.it 执行):
(repl):1: void value expression
puts return a or b ^~
or
的优先级比||
低,这意味着在执行or b
之前将会执行return a
,因此or b
是无法访问的。
||
运算符的引用,问题仍然存在。请重新打开。 - Shelvacu