Ruby:为何示例代码中的and return语句没有执行返回操作?
问题根本原因
这是由Ruby的两个内置特性共同导致的:
- Ruby中
puts方法的返回值固定为nil,nil属于布尔上下文中的假值 - Ruby中
and运算符为短路求值逻辑:只有左侧表达式返回真值时,才会执行右侧的表达式
你写的条件行实际执行顺序等价于如下代码:
if x > 10 # 先执行puts,返回nil(假值) res = puts "#{x} > 10" # 左侧为假,and右侧的return永远不会执行 res and return end
所以调用foo(30)时,执行完第一行puts后直接跳过了return,继续向下执行第二行的puts "#{x} <= 10",就出现了你看到的输出结果。
修复方案
两种常用改法都可以解决问题:
方案1:拆分语句,避免依赖逻辑运算符的执行顺序
def foo(x) if x > 10 puts "#{x} > 10" return end puts "#{x} <= 10" end
方案2:单行写法用&&替代and,加括号明确执行顺序
注意&&优先级高于方法调用,需要用括号包裹puts调用避免语法解析异常:
def foo(x) (puts "#{x} > 10") && return if x > 10 puts "#{x} <= 10" end
内容的提问来源于stack exchange,提问作者Nikhil Gupte
相关产品推荐
相关产品推荐

