gpt4 book ai didi

rust - 如何在切片上实现等同于 take_while?

转载 作者:行者123 更新时间:2023-11-29 08:05:38 24 4
gpt4 key购买 nike

Rust 切片目前不支持某些迭代器方法,即 take_while。为切片实现 take_while 的最佳方法是什么?

const STRHELLO:&'static[u8] = b"HHHello";

fn main() {
let subslice:&[u8] = STRHELLO.iter().take_while(|c|(**c=='H' as u8)).collect();
println!("Expecting: {}, Got {}",STRHELLO.slice_to(3),subslice);
assert!(subslice==STRHELLO.slice_to(3));
}

导致错误:

<anon>:6:74: 6:83 error: the trait `core::iter::FromIterator<&u8>` is not implemented for the type `&[u8]`

围栏中的这段代码: http://is.gd/1xkcUa

最佳答案

首先,您遇到的问题是 collect 是关于创建一个 集合,而切片是关于引用现有数组中连续范围的项目(无论是否动态分配)。

恐怕由于特征的性质,原始容器(STRHELLO)是一个连续范围的事实已经丢失,并且无法在之后重建事实。我还担心“通用”迭代器的任何使用都无法产生所需的输出;类型系统必须以某种方式承载以下事实:

  • 原始容器是一个连续的范围
  • 到目前为止执行的操作链保护了此属性

这可能可行也可能不可行,但我现在没有看到它完成,而且我不确定它可以以何种方式优雅地实现。


另一方面,您可以自己动手做:

fn take_while<'a>(initial: &'a [u8], predicate: |&u8| -> bool) -> &'a [u8] { // '
let mut i = 0u;
for c in initial.iter() {
if predicate(c) { i += 1; } else { break; }
}
initial.slice_to(i)
}

然后:

fn main() {
let subslice: &[u8] = take_while(STRHELLO, |c|(*c==b'H'));
println!("Expecting: {}, Got {}",STRHELLO.slice_to(3), subslice);
assert!(subslice == STRHELLO.slice_to(3));
}

注意:'H' as u8 可以重写为 b'H',如下所示,与字符串对称。

关于rust - 如何在切片上实现等同于 take_while?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27461947/

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