ruby - 复合 bool 表达式 : Void Value Expression

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

  • 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/

相关文章:

ruby - 选择一个字符串,直到 100 个字符后的第一个句点

ruby - DateTime.strptime 我做错了什么?

ruby-on-rails - ruby If .. Else .. End/Increment : Syntax Error

ruby-on-rails - Rails 生成器脚手架自定义,为什么模型和 View 没有属性数据?

ruby - 如何对 UTF-16 文件使用 Ruby 的 readlines.grep?

ruby-on-rails - 不可逆迁移,可以修复吗? - rails 4

ruby-on-rails - 更改 ruby 中 Google 文档的权限?

Ruby每道逻辑题

ruby - 有没有什么好的ruby测试溯源方案?

ruby - 为什么我们要把模块放在 Ruby 的类中?