Ruby 复合布尔表达式:空值表达式

Ruby 复合布尔表达式:空值表达式,ruby,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? a

当我运行该实例方法时,我得到一个错误:

    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?
我来自Python背景,我不想与隐式返回有任何关系。编程本身就有很多地雷

如果我们有一个任意表达式E,它由布尔运算
组成,下面是我们可以执行的一些运算:

  • 如果E
    --起作用
  • E
    ——有效
*
v=E
——有效

  • 返回E
    ——已断开
为什么最后一个案例不起作用

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

v=Ei


进行了评估。忽略Ei+1…k

这可能是由于
的绑定非常弱,导致其解析方式与您预期的不同:

    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
这实际上意味着:

 return x and y
因为您将立即返回,所以它没有机会计算表达式的其余部分

您没有返回的版本是正确的:

 (return x) and y
这不存在绑定问题,更符合Ruby的习惯。请记住,如果您试图在方法的最后一行之前强制退出,则只需将显式的
返回设置为
。反对隐式返回将使您的代码看起来非常非Ruby。这是Ruby如此干净和简单的原因之一,也是类似于
a.map{v|v*2}
的工作原理之一

在罗马时的原则适用于这里。如果您想编写Python风格的Ruby,那么您将违反规则。这就像说“我不喜欢你用口语说X的方式,所以我会忽略这一点,按照我的方式去做。”

这也应该起作用:

x and y
&&
方法的约束非常强,因此
return
是这里最后一个要计算的内容

或者,如果您确实想出于任何原因使用

return x && y

有趣。谢谢你提供的关于结合强度的信息。完全不是人们所期望的。事实上,由于这个问题,我的
v=E
示例不起作用。否则,我确实写了非常地道的Ruby,所以您在这方面的扩展讨论是没有根据的。Re:
return
必须多次指定,因此为了团队的一致性,应该始终指定它。认识到Ruby中有一个隐式的
return
,并且假装没有,这可能会带来很大的问题,这一点很重要。总是使用显式返回往往会产生混乱、偏执的代码。有许多Ruby风格的指南,形式各异,但我从未见过一个支持显式返回的指南。
return (x and y)