如何优雅地跳出Rascal MPL中的visit语句?
如何优雅地跳出Rascal MPL中的visit语句?
我正在使用Rascal中的visit语句遍历字符串,希望匹配到特定情况时直接跳出visit,比如实现下面这段代码的效果,但不想用while循环套一层:
str toVisit = "abcdefgh"; while(true) { visit(toVisit) { case /^bc/: println("before"); case /^de/: break; case /^fg/: println("after"); } break; }
查了visit的官方手册也没找到相关说明,想问问有没有更优雅的方式实现这个需求?
解决方案
- 自定义异常中断遍历:这是目前实现中断
visit最常用的优雅方式。Rascal支持自定义异常,先定义一个用于中断的异常类型,在需要跳出的分支里抛出它,再在visit外部捕获即可终止流程:
// 定义用于中断visit的自定义异常 exception VisitBreak(); str toVisit = "abcdefgh"; try { visit(toVisit) { case /^bc/: println("before"); case /^de/: throw VisitBreak(); // 触发中断 case /^fg/: println("after"); } } catch (VisitBreak()) { // 捕获异常后无需额外操作,流程自然终止 }
- 返回值标记控制(备选):如果场景允许,也可以让
visit返回一个布尔标记,通过判断标记决定后续流程,但这种方式需要在每个case里都处理返回逻辑,相对繁琐,仅适合简单场景。
Rascal的visit本身没有内置的break语法,上述异常方案既能避免冗余的while循环嵌套,也能清晰表达中断意图,是社区认可的替代方案。
内容的提问来源于stack exchange,提问作者Teun M.
相关产品推荐
相关产品推荐

