复合布尔Expr:空值表达式

时间:2015-07-17 16:36:00

标签: ruby

    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,它由布尔运算andor组成,下面是我们可以执行的一些操作:

  • if E - 作品
  • E - 作品

* v = E - 作品

  • return E - 已损坏

为什么最后一个案例不起作用?

编辑:实际上v = E不起作用。只有

v = E i

评估

。 E i + 1 ... k 被忽略。

1 个答案:

答案 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)