设计意图

一个字符串分割器

  1. pub struct StrSplit<'h, 'd> {
  2. reminder: Option<&'h str>,
  3. delimiliter: &'d str,
  4. }
  5. #[allow(dead_code)]
  6. impl<'h, 'd> StrSplit<'h, 'd> {
  7. pub fn new(s: &'h str, delimiliter: &'d str) -> Self {
  8. StrSplit {
  9. reminder: Some(s),
  10. delimiliter,
  11. }
  12. }
  13. }
  14. impl<'h, 'd> Iterator for StrSplit<'h, 'd> {
  15. type Item = &'h str;
  16. fn next(&mut self) -> Option<Self::Item> {
  17. let reminder = self.reminder.as_mut()?;
  18. if let Some(b) = reminder.find(self.delimiliter) {
  19. let util = &reminder[..b];
  20. *reminder = &reminder[b + self.delimiliter.len()..];
  21. Some(util)
  22. } else {
  23. self.reminder.take()
  24. }
  25. }
  26. }
  27. #[allow(dead_code)]
  28. fn until_char<'a>(s: &'a str, c: char) -> &'a str {
  29. let de = format!("{}", c);
  30. StrSplit::new(s, &de).next().expect("not found")
  31. }

结构体 StrSplit包含两个生命周期,’h ‘d 其中h和被切割的str生命周期一致。而在迭代器中迭代器返回的Item同样是h生命周期。因此直接用传入的str构建item迭代项。

until中传入短生命周期的de也没关系