gpt4 book ai didi

match - Any.match 是做什么的?

转载 作者:行者123 更新时间:2023-12-04 14:08:27 27 4
gpt4 key购买 nike

它具有看似简单的代码:

 method match(Any:U: |) { self.Str; nqp::getlexcaller('$/') = Nil }

但是,这是它的行为:
(^3).match(1) # OUTPUT: «「1」␤»

到现在为止还挺好。
say (1,3 ... * ).match(77); # OUTPUT: «Nil␤»

哎呀。现在发生了什么?
say (1,3 ... * ).match(1);    # OUTPUT: «Nil␤»
say (1,3 ... * ).match(/\d/); # OUTPUT: «Nil␤»

不喜欢序列。
say (^10).match(/\d/); # OUTPUT: «「0」␤»

好吧,又说得通了。
say <a b c>.match(/\w/); # OUTPUT: «「a」␤»

恢复正常。那么它不喜欢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: '.'; # 「.」

我是如何解决这个问题的

首先,您正在查看错误的方法定义:
method match(Any:U: |) { ... }
Any:U有点像 Any $ where not .defined除非它匹配,否则您将收到错误消息“例程'match'的参数' '必须是'Any'类型的类型对象,而不是对象实例......”。

但是你传递了一个定义的 Seq .所以你的 .match调用不会分派(dispatch)到您正在查看的方法定义。

要找出方法分派(dispatch)到的对象,请使用:
say (1,3 ... *).^lookup('match').package ; # (Cool)

定义 Seq将因此发送到 the Cool code :
method match(Cool:D: |c) {
...
self.Stringy.match(|c)
}

那么,接下来:
say (1,3 ... *).^lookup('Stringy').package ; # (Mu)

the code :
multi method Stringy(Mu:D $:) { self.Str }

所以检查:
say (1,3 ... *).Str; # ...

答对了。

并确认:
say (1,3 ... *).match: '.'; # 「.」

关于match - Any.match 是做什么的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54821315/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com