Ruby在if分支内使用redo报语法错误,是否有旧版本支持该用法?
关于Ruby
redo语法错误的原因说明 Ruby的
redo语句设计初衷是重新执行当前最内层的循环/迭代器/异常重试块,它的有效作用范围仅包括:
while、until、for循环结构- 各类迭代器(如
each、loop)的代码块begin/rescue结构的重试逻辑
普通if条件分支不属于上述可使用redo的范围,从Ruby正式发行的1.8系列到最新的3.x系列,都不支持在if块内直接调用redo,不存在所谓"更老版本支持该写法"的情况。
前同事代码可正常运行的可能原因
- 原完整代码中该
if分支外层存在被遗漏的循环/迭代器结构:比如原方法内if外层套了loop do,或者调用该方法的外层逻辑包了循环结构,redo实际作用的是外层符合要求的结构,你接手时可能因为代码删减、粘贴遗漏丢失了外层结构。 - 原运行环境引入了自定义语法扩展类的gem,修改了Ruby默认的语法解析规则,支持了非标准场景下的
redo调用,这种情况不属于Ruby官方语法范畴。
替换为while的合理性
你将if修改为while的解决方案完全符合官方语法规则:while属于合法的循环结构,redo会直接跳回while的条件判断位置重新执行,完美匹配限流等待后重试检查的业务逻辑。
内容的提问来源于stack exchange,提问作者user13516810
相关产品推荐
相关产品推荐

