def success?
return @fhosts.empty? and @khosts.empty? and @shosts.any?
end
当我运行该实例方法时,出现错误:
/home/fandingo/code/management/lib/ht.rb:37: void value expression
return @fhosts.empty? and @khosts.empty? and @shosts.any?
我对这个工作后发生的事情感到困惑
def success?
@fhosts.empty? and @khosts.empty? and @shosts.any?
# This also works
# r = @fhosts.empty? and @khosts.empty? and @shosts.any?
# return r
end
我来自 Python 背景,我不希望与隐式返回有任何关系。编程有很多地雷。
如果我们有一个任意表达式 E,它由 bool 运算 and
和 or
一起组成,下面是我们可以执行的一些操作:
if E
-- 有效E
-- 有效
* v = E
-- 有效
return E
-- 损坏
为什么最后一个案例不起作用?
编辑:实际上 v = E
不起作用。只有
v = Ei
被评估。 Ei+1...k 被忽略。
最佳答案
这可能是由于 和
的绑定(bind)非常弱,导致它的解析与您预期的不同:
return x and y
这实际上意味着:
(return x) and y
由于您要立即返回,因此它没有机会计算表达式的其余部分。
你的没有return
的版本是正确的:
x and y
这没有绑定(bind)问题,而且更符合 Ruby 的习惯。请记住,如果您试图在方法的最后一行之前强制退出,则只需要显式地放置一个 return
。反对隐式返回将使您的代码看起来非常非 Ruby。它们是 Ruby 如此干净和简单的原因之一,以及像 a.map { |v| 这样的东西。 v * 2
有效。
When in Rome 原则适用于此。如果您想编写 Python 风格的 Ruby,那么您将背道而驰。这就像在说“我不喜欢你用口语说 X 的方式,所以我会忽略它并按照我的方式去做。”
这也应该有效:
return x && y
&&
方法是非常强绑定(bind)的,所以 return
是这里计算的最后一个东西。
或者如果你出于任何原因真的想使用和
:
return (x and y)
关于ruby - 复合 bool 表达式 : Void Value Expression,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31480624/