jjm*_*elo 6 match stringification perl6 seq
它有一个欺骗性的简单代码:
method match(Any:U: |) { self.Str; nqp::getlexcaller('$/') = Nil }
Run Code Online (Sandbox Code Playgroud)
但是,这是它的行为:
(^3).match(1) # OUTPUT: «?1??»
Run Code Online (Sandbox Code Playgroud)
到现在为止还挺好.
say (1,3 ... * ).match(77); # OUTPUT: «Nil?»
Run Code Online (Sandbox Code Playgroud)
Ooookey.现在发生了什么?
say (1,3 ... * ).match(1); # OUTPUT: «Nil?»
say (1,3 ... * ).match(/\d/); # OUTPUT: «Nil?»
Run Code Online (Sandbox Code Playgroud)
不喜欢序列.
say (^10).match(/\d/); # OUTPUT: «?0??»
Run Code Online (Sandbox Code Playgroud)
好的,再次有意义.
say <a b c>.match(/\w/); # OUTPUT: «?a??»
Run Code Online (Sandbox Code Playgroud)
恢复正常.它不喜欢Seqs吗?我假设,因为我查看了其他类的代码并且match没有重新实现,所有这些代码都调用了代码.但是我没有看到如何返回字符串并从NPQ设置变量,或者为什么它不能用于序列.
.match是在一个干草堆串中搜索针.无限序列字符串化'...'.
say (1,3 ... 9).Str; # 1 3 5 7 9
say (1,3 ... 9).match: '1'; # ?1?
say (1,3 ... *).Str; # ...
say (1,3 ... *).match: '.'; # ?.?
Run Code Online (Sandbox Code Playgroud)
首先,您正在查看错误的方法定义:
method match(Any:U: |) { ... }
Run Code Online (Sandbox Code Playgroud)
Any:U有点像,Any $ where not .defined除非它匹配,你会得到错误消息"例程'匹配'的参数'<anon>'必须是'Any'类型的类型对象,而不是对象实例......".
但是你传递了一个定义的 Seq.因此,您的.match调用不会调度到您正在查看的方法定义.
要找出方法调度的内容,请使用:
say (1,3 ... *).^lookup('match').package ; # (Cool)
Run Code Online (Sandbox Code Playgroud)
甲定义 Seq从而就会分派到的Cool代码:
method match(Cool:D: |c) {
...
self.Stringy.match(|c)
}
Run Code Online (Sandbox Code Playgroud)
那么,下一个:
say (1,3 ... *).^lookup('Stringy').package ; # (Mu)
Run Code Online (Sandbox Code Playgroud)
和代码:
multi method Stringy(Mu:D $:) { self.Str }
Run Code Online (Sandbox Code Playgroud)
所以检查:
say (1,3 ... *).Str; # ...
Run Code Online (Sandbox Code Playgroud)
答对了.
并确认:
say (1,3 ... *).match: '.'; # ?.?
Run Code Online (Sandbox Code Playgroud)