我正在玩字符串的位置界面。我知道如何像 Python 在 Perl 6 中那样对字符串进行切片?,但我很好奇我是否可以让这件事只为傻笑而工作。
我想出了这个例子。阅读位置很好,但我不知道如何设置multi
来处理作业:
multi postcircumfix:<[ ]> ( Str:D $s, Int:D $n --> Str ) {
$s.substr: $n, 1
}
multi postcircumfix:<[ ]> ( Str:D $s, Range:D $r --> Str ) {
$s.substr: $r.min, $r.max - $r.min + 1
}
multi postcircumfix:<[ ]> ( Str:D $s, List:D $i --> List ) {
map( { $s.substr: $_, 1 }, @$i ).list
}
multi postcircumfix:<[ ]> ( Str:D $s, Int:D $n, *@a --> Str ) is rw {
put "Calling rw version";
}
my $string = 'The quick, purple butterfly';
{ # Works
my $single = $string[0];
say $single;
}
{ # Works
my $substring = $string[5..9];
say $substring;
}
{ # Works
my $substring = $string[1,3,5,7];
say $substring;
}
{ # NOPE!
$string[2] = 'Perl';
say $string;
}
最后一个不起作用:
T
uick,
(h u c)
Index out of range. Is: 2, should be in 0..0
in block <unit> at substring.p6 line 36
Actually thrown at:
in block <unit> at substring.p6 line 36
不过,我不认为它会起作用。我不知道它应该有什么签名或特征来做我想做的事。
$ perl6
> "some string"[0]
some string
文档主要暗示了[]
从事位置角色的事物的工作,并且这些事物在列表中,就像事物一样。从[]
操作员的文档中:
用于对@container 的零个或多个元素进行位置访问的通用接口,也称为“数组索引运算符”。
但Str
令人惊讶的是,即使它不是@container
(据我所知),它也扮演了必要的角色:
> "some string".does( 'Positional' )
True
有没有办法测试某事是一个@container
?
有没有办法让一些东西列出它的所有角色?
现在,知道一个字符串可以响应[]
,我怎样才能确定哪个签名会匹配呢?我想知道正确的签名用于定义我自己的版本以通过[]
.