Вот решение, которое я бы использовал:
my method break (Str \s: *@i where .all ~~ Int) {
gather for @i Z [\+] 0,|@i -> ($length, $start) {
take s.substr: $start, $length
}
}
say "abcdefghi".&break(2,3,4) # "ab","cde","fghi"
gather
/ take
позволяет быть ленивым, если в конечном итоге вам не нужно использовать их все. L oop берет @i
(2,3,4
в примере) и архивирует его с помощью каскадного сложного редуктора [\+]
, который обычно выдает 2,5,9
, но мы вставляем 0, чтобы сделать его 0,2,5,9
для отметьте начальные индексы каждого. Это позволяет сделать фактический дубль простой операцией substr
.
Сделав ее method
вместо сабвуфера, вы можете использовать ее так же, как и вы (вы даже можете назвать ее split
, если вы хочу, добавление &
сигил означает, что Raku не будет смущен, хотите ли вы встроенный или изготовленный на заказ.
Вы можете, даже, добавить его непосредственно в Str:
use MONKEY-TYPING; # enable augment
augment class Str {
multi method split (Str \s: *@i where .all ~~ Int) {
gather for @i Z [\+] 0,|@i -> ($length, $start) {
take s.substr: $start, $length
}
}
}
say "abcdefghi".split(2,3,4)
В этом случае он должен быть определен как multi method
, поскольку уже существуют различные методы split
. Приятно то, что ни один из них не определен только Int
аргументами, легко обеспечить наш расширенный можно привыкнуть.
Тем не менее, назвать его, используя подписанную версию в лексическом method
, определенно лучше.