ohm*_*udy 3 string roles slice perl6
在Python中,我可以像这样拼接字符串:
solo = A quick brown fox jump over the lazy dog
solo[3:5]
Run Code Online (Sandbox Code Playgroud)
我知道substr并且comb已经足够了,我想知道它是否可行,但是.我应该使用角色来做到这一点吗?
sml*_*mls 14
字符串(表示为类Str)在Perl 6中被视为单个值而不是位置数据结构,因此无法使用内置[ ]数组索引运算符进行索引/切片.
my $solo = "A quick brown fox jumps over the lazy dog";
dd $solo.comb[3..4].join; # "ui"
dd $solo.comb[3..^5].join; # "ui"
dd $solo.substr(3, 2); # "ui"
dd $solo.substr(3..4); # "ui"
dd $solo.substr(3..^5); # "ui"
Run Code Online (Sandbox Code Playgroud)
如果要修改切片,请使用substr-rw:
$solo.substr-rw(2..6) = "slow";
dd $solo; # "A slow brown fox jumps over the lazy dog"
Run Code Online (Sandbox Code Playgroud)
[ ]直接在字符串上工作如果你真的想要,你可以在你的字符串中组成一个添加方法的角色AT-POS,这会使[ ]操作员对它起作用:
my $solo = "A quick brown fox jumps over the lazy dog" but role {
method AT-POS ($i) { self.substr($i, 1) }
}
dd $solo[3..5]; ("u", "i", "c")
Run Code Online (Sandbox Code Playgroud)
但是,这会将切片作为列表返回,因为这是[ ]操作员默认执行的操作.要使它返回串联字符串,您必须重新实现[ ]类型Str:
multi postcircumfix:<[ ]>(Str $string, Int:D $index) {
$string.substr($index, 1)
}
multi postcircumfix:<[ ]>(Str $string, Range:D $slice) {
$string.substr($slice)
}
multi postcircumfix:<[ ]>(Str $string, Iterable:D \slice) {
slice.map({ $string.substr($_, 1) }).join
}
my $solo = "A quick brown fox jumps over the lazy dog";
dd $solo[3]; # "u"
dd $solo[3..4]; # "ui"
dd $solo[3, 5]; # "uc"
Run Code Online (Sandbox Code Playgroud)
您可以扩展[ ]此处添加的多候选项以处理运算符为列表提供的所有其他魔法,例如:
$solo[*-1]$solo[3..*]$solo[3..5]:kv$solo[2..6] = "slow"但要做到这一点需要付出很多努力.
另外,请记住,重写内置运算符来执行他们不应该做的事情,会让其他Perl 6程序员感到困惑,他们将来必须审查或使用您的代码.