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)