gpt4 book ai didi

rust - 如何迭代分隔字符串,累积先前迭代的状态而不显式跟踪状态?

转载 作者:行者123 更新时间:2023-12-02 09:04:08 25 4
gpt4 key购买 nike

我想在分隔字符串上生成一个迭代器,以便在每次迭代中返回由分隔符分隔的每个子字符串以及上一次迭代中的子字符串(包括分隔符)。

例如,给定字符串“ab:cde:fg”,迭代器应返回以下内容:

  1. “ab”
  2. “ab:cde”
  3. “ab:cde:fg”

简单的解决方案

一个简单的解决方案是迭代从分隔符上拆分返回的集合,并跟踪先前的路径:

let mut state = String::new();
for part in "ab:cde:fg".split(':') {
if !state.is_empty() {
state.push_str(":");
}
state.push_str(part);
dbg!(&state);
}

这里的缺点是需要使用额外的可变变量显式跟踪状态。

使用扫描

我认为scan可以用来隐藏状态:

    "ab:cde:fg"
.split(":")
.scan(String::new(), |state, x| {
if !state.is_empty() {
state.push_str(":");
}
state.push_str(x);
Some(&state)
})
.for_each(|x| { dbg!(x); });

但是,此操作失败并出现错误:

cannot infer an appropriate lifetime for borrow expression due to conflicting requirements

scan 版本有什么问题以及如何修复?

最佳答案

为什么还要构建一个新字符串?您可以获得 : 的索引并对原始字符串使用切片。

fn main() {
let test = "ab:cde:fg";

let strings = test
.match_indices(":") // get the positions of the `:`
.map(|(i, _)| &test[0..i]) // get the string to that position
.chain(std::iter::once(test)); // let's not forget about the entire string

for substring in strings {
println!("{:?}", substring);
}
}

( Permalink to the playground )

关于rust - 如何迭代分隔字符串,累积先前迭代的状态而不显式跟踪状态?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60417558/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com