gpt4 book ai didi

rust - 如何在迭代器上调用计数并仍然使用迭代器的项目?

转载 作者:行者123 更新时间:2023-11-29 07:50:44 26 4
gpt4 key购买 nike

parts.count() 导致所有权转移,因此 parts 不能再使用。

fn split(slice: &[u8], splitter: &[u8]) -> Option<Vec<u8>> {
let mut parts = slice.split(|b| splitter.contains(b));

let len = parts.count(); //ownership transfer

if len >= 2 {
Some(parts.nth(1).unwrap().to_vec())
} else if len >= 1 {
Some(parts.nth(0).unwrap().to_vec())
} else {
None
}
}

fn main() {
split(&[1u8, 2u8, 3u8], &[2u8]);
}

最佳答案

如果您只需要使用第一部分或第二部分,也可以避免不必要的 Vec 分配:

fn split<'a>(slice: &'a [u8], splitter: &[u8]) -> Option<&'a [u8]> {
let mut parts = slice.split(|b| splitter.contains(b)).fuse();

let first = parts.next();
let second = parts.next();

second.or(first)
}

然后如果你真的需要一个 Vec 你可以在结果上映射:

split(&[1u8, 2u8, 3u8], &[2u8]).map(|s| s.to_vec())

当然,如果你愿意,你可以将to_vec()转换移动到函数中:

second.or(first).map(|s| s.to_vec())

我调用 fuse()在迭代器上,以保证在返回第一个 None 之后它总是返回 None(通用迭代器协议(protocol)不能保证这一点)。

关于rust - 如何在迭代器上调用计数并仍然使用迭代器的项目?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28233640/

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