当前使用的Rakudo编译器(v2021.10)中,使用::(…)
形式声明的symbols,即使它们声明了例程的名称,也不需要遵循rules for identifiers。
这意味着以下代码将产生指定的输出:
class C { method ::("A method name that's also a sentence!") { say "this works"} }
sub ::("☺") { say "also works" }
C."A method name that's also a sentence!"(); # OUTPUT: «this works»
&::("☺")(); # OUTPUT: «also works»
我的问题是这是否是有效的Raku/有意的特性,还是偶然或仅适用于Rakudo。我没有在Raku文档中看到任何关于此语法的提及,也没有看到Roast测试涵盖创建这样的符号。
(有一个与此有些相关的Roast测试,涉及在符号引用中使用特殊字符。但是,除了不直接相关之外,该测试还包含“注意:我不确定这是否是合法的语法”的略微无用的注释。那个注释(和那个测试)已经添加了13年以上,所以这个领域似乎没有引起太多关注。)
我之所以问,部分原因是因为,如果是合法/预期的,这种语法似乎在某些特定情况下非常有用(特别是对于方法,在那里调用语法更好)。它让我想起Kotlin的语法,允许在反引号括起来的方法名中使用空格。因此,如果它是Raku的一部分,我想要(适度地)使用这种语法并将其添加到文档中。