Ruby使用OR/||作为循环控制条件时会同时计算两个表达式吗?
Ruby逻辑或在循环条件中「看似不短路」的问题解答
首先明确结论:Ruby的or、||逻辑或运算的短路规则是全局统一的,不存在if条件下生效、循环条件下不生效的差异,你遇到的报错是完全符合规则的正常表现。
两个示例的本质差异如下:
- 第一个if示例
代码中i固定为1,i < 5的求值结果永远为true,按照短路规则,or右侧的i.upcase == i永远不会被执行,因此不会抛出方法不存在的错误。
示例代码:i = 1 puts "this returns true" if (i < 5) or ( i.upcase == i) - 第二个while示例
循环过程中i会逐次自增:
当i在0~4区间时,i <5求值为true,短路规则正常生效,不会执行右侧表达式,循环正常运行;
当i自增到5时,i <5求值为false,此时才会触发逻辑或的后半段求值,对i.upcase == i进行计算,而整数类型没有upcase方法,因此抛出undefined method 'upcase' for 5:Integer (NoMethodError)错误。
示例代码:i = 0 while (i < 5) or ( i.upcase == i) i+=1 end
你可以通过简单修改验证上述逻辑:比如将循环终止条件调整为i < 1,第一次循环i=0时i<1为真,不会执行右侧代码;i自增到1后,i<1为假,立刻触发右侧upcase调用报错,完全符合短路规则的表现。
内容的提问来源于stack exchange,提问作者user17085755
相关产品推荐
相关产品推荐

