Any.match有什么作用?

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设置变量,或者为什么它不能用于序列.

rai*_*iph 8

.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)