【发布时间】:2017-12-30 17:43:57
【问题描述】:
我正在使用字符串的位置界面。我知道How can I slice a string like Python does in 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
文档主要暗示[] 适用于具有Positional 角色的事物,并且这些事物在列表中。来自[] docs in operators:
用于对@container 的零个或多个元素进行位置访问的通用接口,也称为“数组索引运算符”。
但Str 令人惊讶地扮演了必要的角色,即使它不是@container(据我所知):
> "some string".does( 'Positional' )
True
有没有办法测试某个东西是@container?
有没有办法让某个东西列出它的所有角色?
现在,知道一个字符串可以响应[],我如何才能确定哪个签名会匹配呢?我想知道正确的签名用于定义我自己的版本以通过[] 写入此字符串。
【问题讨论】:
-
但是,例如,
Int不会发生同样的事情。它不做位置。 -
您误用了
.does- 它需要一个类型对象(或者,查看implementation,一个将与之比较的任意对象)而不是名称:"some string".does( 'Positional' )是相当于"some string".does( Str ),而不是"some string".does( Positional ) -
那么
.does应该抱怨一下。
标签: role raku multimethod