Метод не должен соответствовать ни одному классу:
my method bar () { say self, '!' }
bar 'Hello World'; # Hello World!
my regex baz { :ignorecase 'hello world' }
'Hello World' ~~ /<baz>/;
'Hello World' ~~ &baz;
&baz.ACCEPTS('Hello World'); # same as previous line
# baz 'Hello World';
По умолчанию методы и регулярные выражения расширений имеют отношение has
с любым классом, в котором они объявлены.
class Foo {
method bar () { say self, '!' }
# has method bar () { say self, '!' }
regex baz { :ignorecase 'hello world' }
# has regex baz () { :ignorecase 'hello world' }
}
Регулярному выражению нужны некоторые требования, какими бы ни были его инвоканты.
Просто запустив его как подпрограмму, он сообщает вам первое:
my regex baz { :ignorecase 'hello world' }
baz 'Hello World';
No such method '!cursor_start' for invocant of type 'Str'
in regex baz at <unknown file> line 1
in block <unit> at <unknown file> line 1
Обычно регулярное выражение объявляется внутри класса, объявленного с grammar
.
grammar Foo {
}
say Foo.^mro;
# ((Foo) (Grammar) (Match) (Capture) (Cool) (Any) (Mu))
Таким образом, требования, вероятно, выполняются Grammar
, Match
или Capture
в этом случае.
Это также может быть из роли, с которой он состоит.
say Foo.^roles.map(*.^name);
# (NQPMatchRole)
Есть еще больше оснований полагать, что это Match
или Capture
my regex baz {
^
{ say 'baz was called on: ', self.^name }
}
&baz.ACCEPTS(''); # baz was called on: Match
my regex baz ( $s ) {
:ignorecase
"$s"
}
baz Match.new(orig => 'Hello World'), 'hello';
# 「Hello」
Я не вижу причин, по которым кто-то не мог бы сделать это самостоятельно в обычном классе.
Обратите внимание, что $/
- это просто переменная.То, что сказать, что оно передано в регулярное выражение, является неправильным пониманием ситуации.
my regex baz ( $/ ) {
:ignorecase
"$/"
}
'Hello World' ~~ /<baz('hello')>/;
# 「Hello」
# baz => 「Hello」
Было бы точнее сказать, что при вызове регулярного выражения изнутри другого текущий $/
используется каквызов метода / регулярного выражения.
(я не совсем уверен, что это именно то, что происходит.)
Так что предыдущий пример будет выглядеть примерно так:
'Hello World' ~~ /{ $/.&baz('hello') }/;