设计意图
一个字符串分割器
pub struct StrSplit<'h, 'd> {
reminder: Option<&'h str>,
delimiliter: &'d str,
}
#[allow(dead_code)]
impl<'h, 'd> StrSplit<'h, 'd> {
pub fn new(s: &'h str, delimiliter: &'d str) -> Self {
StrSplit {
reminder: Some(s),
delimiliter,
}
}
}
impl<'h, 'd> Iterator for StrSplit<'h, 'd> {
type Item = &'h str;
fn next(&mut self) -> Option<Self::Item> {
let reminder = self.reminder.as_mut()?;
if let Some(b) = reminder.find(self.delimiliter) {
let util = &reminder[..b];
*reminder = &reminder[b + self.delimiliter.len()..];
Some(util)
} else {
self.reminder.take()
}
}
}
#[allow(dead_code)]
fn until_char<'a>(s: &'a str, c: char) -> &'a str {
let de = format!("{}", c);
StrSplit::new(s, &de).next().expect("not found")
}
结构体 StrSplit
包含两个生命周期,’h ‘d 其中h和被切割的str生命周期一致。而在迭代器中迭代器返回的Item同样是h生命周期。因此直接用传入的str构建item迭代项。
until中传入短生命周期的de也没关系