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,它由布尔运算and
和or
组成,下面是我们可以执行的一些操作:
if E
- 作品E
- 作品 * v = E
- 作品
return E
- 已损坏为什么最后一个案例不起作用?
编辑:实际上v = E
不起作用。只有
v = E i
评估。 E i + 1 ... k 被忽略。
答案 0 :(得分:1)
这可能是由于and
的绑定非常弱导致它以不同于您预期的方式解析:
return x and y
这实际上意味着:
(return x) and y
由于您立即返回,因此无法评估表达式的其余部分。
没有return
的版本是正确的:
x and y
这没有绑定问题,而且是更惯用的Ruby。请记住,如果您尝试在方法的最后一行之前强制退出,则只需要显式return
。反对隐式返回会使你的代码看起来非常非Ruby。他们是Ruby非常简洁的原因之一,以及a.map { |v| v * 2 }
之类的工作原理。
在罗马时原则适用于此处。如果你想编写Python风格的Ruby,那么你将会反对谷歌。这就像说'#34;我不喜欢你用口语说X,所以我会忽略它并按照我的方式去做。"
这也应该有效:
return x && y
&&
方法非常强大,因此return
是此处评估的最后一项。
或者,如果你真的想因任何原因使用and
:
return (x and y)