bri*_*foy 4 role perl6 multimethod
我正在玩一个字符串的位置界面.我知道如何在Perl 6中像Python一样切割字符串?,但我很好奇,如果我能让这件事只是为了咯咯笑.
我想出了这个例子.阅读职位很好,但我不知道如何设置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;
}
Run Code Online (Sandbox Code Playgroud)
最后一个不起作用:
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
Run Code Online (Sandbox Code Playgroud)
不过,我认为它不会起作用.我不知道应该做什么样的签名或特征来做我想做的事情.
$ perl6
> "some string"[0]
some string
Run Code Online (Sandbox Code Playgroud)
这些文档主要意味着[]
关于做位置角色的事物的作品以及那些事物在列表中的东西.来自[]
运营商的文档:
用于定位访问@container的零个或多个元素的通用接口,也称为"数组索引操作符".
但Str
令人惊讶的是,即使它不是@container
(据我所知),它也是必要的角色:
> "some string".does( 'Positional' )
True
Run Code Online (Sandbox Code Playgroud)
有没有办法测试某些东西是@container
什么?
有没有办法得到一些东西来列出它的所有角色?
现在,知道一个字符串可以响应[]
,我怎么能弄清楚哪个签名会匹配呢?我想知道用于定义我自己的版本以写入此字符串的正确签名[]
.
实现此目的的一种方法是扩充Str
类,因为您实际上只需要覆盖AT-POS
方法(Str
通常继承自Any
):
use MONKEY;
augment class Str {
method AT-POS($a) {
self.substr($a,1)
}
}
say "abcde"[3] # d
say "abcde"[^3] # (a b c)
Run Code Online (Sandbox Code Playgroud)
更多信息可以在这里找到:https://docs.perl6.org/language/subscripts#Methods_to_implement_for_positional_subscripting
归档时间: |
|
查看次数: |
270 次 |
最近记录: |