Raku中无法使用OUTER作为循环控制标签的问题咨询
Raku中
OUTER作为标签使用时出现异常的原因 现象复现
先看标签类型的检测结果:
OUTA: say OUTA.^name; # 输出 Label OUTER: say OUTER.^name; # 输出 OUTER
可以看到自定义标签OUTA被正确识别为Label类型,但OUTER却被识别为自身的特殊类型。
再看循环控制的差异:
OUTA: loop { last OUTA } # 正常执行,无报错 OUTER: loop { last OUTER } # 执行触发错误
完整报错示例
运行以下代码:
OUTER: loop { loop { state $c = 0; say $c++; last OUTER if $c > 2 } }
会先输出0、1、2,随后抛出错误:
Cannot resolve caller last(OUTER:U); none of these signatures matches:
( --> Nil)
(Label:D $x --> Nil)
in block atline 1
in blockat line 1
in anyat /opt/homebrew/Cellar/rakudo-star/2024.03/bin/../share/perl6/runtime/perl6.moarvm line 1
in anyat /opt/homebrew/Cellar/rakudo-star/2024.03/bin/../share/perl6/runtime/perl6.moarvm line 1
原因分析
OUTER是Raku内置的伪包(pseudo-package),它的作用是在嵌套作用域中引用外层作用域的符号,解析优先级高于用户自定义的标签。当你使用OUTER作为标签名时,解析器会优先将其识别为内置伪包,而非用户定义的Label实例,而last函数要求接收一个Label:D类型的参数,因此会触发签名不匹配的错误。
而OUTA、OUT、OUTE这类名称不属于Raku的内置保留符号,因此可以被正常解析为用户自定义标签,不会出现冲突。
内容的提问来源于stack exchange,提问作者AlvaPan
相关产品推荐
相关产品推荐

