gpt4 book ai didi

rust - 如何将元素从盒装切片中移出,在此过程中消耗切片?

转载 作者:行者123 更新时间:2023-12-03 11:26:44 24 4
gpt4 key购买 nike

例如:

struct T(u32); // No Copy implementation

fn consume(t: T) {}

fn main() {
let v = vec![T(1), T(2)];
let s = v.into_boxed_slice();
// Get a Box<[T]> from somewhere and consume it:
for t in s {
consume(t);
}
}
导致编译器错误:
error[E0277]: `[T]` is not an iterator
--> src/main.rs:9:14
|
9 | for t in s {
| ^ `[T]` is not an iterator
|
= help: the trait `std::iter::Iterator` is not implemented for `[T]`
= note: required because of the requirements on the impl of `std::iter::Iterator` for `std::boxed::Box<[T]>`
我可以用 s.into_vec()构建一个 Vec从盒装切片,然后消费向量。这将接近无操作性能,但有没有更优雅的方法?

最佳答案

直接支持这个有一个 Rust 问题:Box<[T]> should have an IntoIter implementation .
在稳定的 Rust 中你能做的最好的事情就是将它转换成 Vec :

let v = Vec::from(s);
for t in v {
consume(t);
}
我认为这不会因为转换为 Vec 而导致性能下降。基本上加了一个 usize .

如果在编译时知道切片的长度,可以将切片转换为 Box<[T; N]>然后使用 array::IntoIter 迭代:
use std::convert::TryInto;

let a: Box<[T; 2]> = match s.try_into() {
Ok(a) => a,
Err(_) => panic!("Not length 2"),
};

for t in std::array::IntoIter::new(*a) {
consume(t);
}

关于rust - 如何将元素从盒装切片中移出,在此过程中消耗切片?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42540227/

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