簡體   English   中英

Any.match有什么作用?

[英]What does Any.match do?

它有一個欺騙性的簡單代碼:

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

但是,這是它的行為:

(^3).match(1) # OUTPUT: «「1」␤»

到現在為止還挺好。

say (1,3 ... * ).match(77); # OUTPUT: «Nil␤»

Ooookey。 現在發生了什么?

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是在單個haystack字符串中搜索一個針。 無限序列字符串為'...'

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除非它匹配你會得到錯誤消息“參數'<anon>'例程'匹配'必須是'任何'類型的類型對象,而不是對象實例。 ..“。

但是你傳遞了一個定義的 Seq 因此,您的.match調用不會調度到您正在查看的方法定義。

要找出方法調度的內容,請使用:

say (1,3 ... *).^lookup('match').package ; # (Cool)

因此, 定義的 Seq將分派給Cool代碼

method match(Cool:D: |c) {
    ...
    self.Stringy.match(|c)
}

那么,下一個:

say (1,3 ... *).^lookup('Stringy').package ; # (Mu)

代碼

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

所以檢查:

say (1,3 ... *).Str; # ...

答對了。

並確認:

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

接受的答案完全解釋了發生了什么。 我只是添加這個來展示如何做OP似乎有意的事情的一些例子。

doug$ perl6
To exit type 'exit' or '^D'
> say (^3).any.match(/\d/)
any(「0」, 「1」, 「2」)
> say (^3).any.match(/\d/).so
True
> say (^3).any.match(/ <alpha> /).so
False
> say ('a'..'c').any.match(/ <alpha> /).so
True
> # say (0 ... *).any.match(/ \d /).so ## ==> never terminates
Nil
> say (0 ... *).first(/ \d /)
0
> say (0 ... *).first(/ \d\d /)
10
>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM