I'm on rustc 1.0.0-beta (9854143cb 2015-04-02) (built 2015-04-02)
My goal is to split a string of length n into n-k+1 offset substrings of length k. What I mean by that is if you have a string:
ABCDEF
I'm trying to obtain a vector/iterator that contains offset substrings of arbitrary length k. For example, k=3 would yield
ABC
BCD
CDE
DEF
And k=2 would yield:
AB
BC
CD
DE
EF
Note that the whitespace is only included above to align the substrings to show how they are related. The output vector would only include AB,BC, CD, etc. Also, it's ok to only support ASCII, although I would prefer a safer more generic solution.
As painful as it is to look at, the following procedural code seems to work:
fn offset_slices(s: &str, n: usize) -> Vec<&str> {
let mut slices: Vec<&str> = Vec::new();
for (i,_) in s.chars().enumerate() {
if i > s.len() - n {
break;
}
slices.push(&s[i..(i+n)]);
}
slices
}
But it's nasty and I would prefer a more functional solution. I spent a couple hours trying to figure out a way, and learned a lot in the process, but I'm stumped on this one.
Any ideas?
PS - I'm really surprised that the slices.push(&s[i..(i+n)]) above even compiles. Is it just returning pointers to various locations of the input?
fn offset_slices(s: &str, n: usize) -> Vec<&str> {
(0 .. s.len() - n + 1).map(|i| &s[i .. i + n]).collect()
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With