【发布时间】:2017-06-01 00:53:45
【问题描述】:
在 Python 中,我可以这样拼接字符串:
solo = A quick brown fox jump over the lazy dog
solo[3:5]
我知道substr 和comb 就足够了,我想知道这是否可能,但是。我应该使用角色来执行此操作吗?
【问题讨论】:
在 Python 中,我可以这样拼接字符串:
solo = A quick brown fox jump over the lazy dog
solo[3:5]
我知道substr 和comb 就足够了,我想知道这是否可能,但是。我应该使用角色来执行此操作吗?
【问题讨论】:
字符串(表示为 Str 类)在 Perl 6 中被视为单个值而不是位置数据结构,因此无法使用内置的 [ ] 数组索引运算符进行索引/切片。
正如您已经建议的那样,comb 或 substr 是要走的路:
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"
如果要修改切片,请使用substr-rw:
$solo.substr-rw(2..6) = "slow";
dd $solo; # "A slow brown fox jumps over the lazy dog"
[ ] 直接作用于字符串如果你真的想要,你可以在你的字符串中添加一个角色,添加方法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")
但是,这会将切片作为列表返回,因为这是 [ ] 运算符默认执行的操作。要让它返回一个连接的字符串,你必须重新实现[ ] 类型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"
您可以扩展此处添加的 [ ] 多候选,以处理运算符为列表提供的 all the other magic,例如:
$solo[*-1]
$solo[3..*]
$solo[3..5]:kv
$solo[2..6] = "slow"
但要做到这一切需要付出很多努力。
另外,请记住,重写内置运算符来做他们不应该做的事情,会让其他 Perl 6 程序员感到困惑,他们将来必须审查或使用您的代码。
【讨论】: