如何让Raku自定义中缀运算符直接传递Whatever而非生成WhateverCode?
解决Raku中Whatever对象被解析为WhateverCode的问题
问题分析
你定义的自定义中缀运算符<-_->期望接收Whatever对象和5作为参数,但* -_- 5会被Raku解析为构建WhateverCode闭包,而非直接传递Whatever对象,导致输出不符合预期。
解决方案
要让*以Whatever对象的形式传入运算符,需要明确告诉解析器这是一个单独的Whatever实例,有两种可行方法:
方法1:用括号包裹*
通过括号强制将*解析为独立表达式:
sub infix:<-_->(*@args) is assoc("list") { @args.raku } say (*) -_- 5
方法2:直接使用Whatever类型名
显式调用Whatever单例(Raku中该类型为单例,直接用类型名即可获取实例):
sub infix:<-_->(*@args) is assoc("list") { @args.raku } say Whatever -_- 5
运行结果
两种方法的输出均为:
[Whatever, 5]
原因说明
Raku的语法规则中,当*出现在二元运算符的左侧操作数位置时,会优先触发WhateverCode的解析逻辑——它会将*视为闭包的占位符,生成一个接收参数并应用运算符的匿名函数。通过括号或显式类型名,可以打破这个优先级,让*被解析为单独的Whatever单例对象。
内容的提问来源于stack exchange,提问作者freddy
相关产品推荐
相关产品推荐

