如何在 Rust 中将一个包装数组转换为 Vec

9
我有一个结构体的盒式数组,我想要使用这个数组并将其插入到一个向量中。
我的当前方法是将数组转换为向量,但相应的库函数似乎不按我预期的方式工作。
let foo = Box::new([1, 2, 3, 4]);
let bar = foo.into_vec();

编译器错误提示:当前范围内没有找到类型为Box<[_; 4]>的into_vec方法。可以在这里找到相关规范。
fn into_vec(self: Box<[T]>) -> Vec<T>
Converts self into a vector without clones or allocation.

我不太确定如何应用它,请问有什么建议吗?

2个回答

9

我认为有更加简洁的方法来实现这个功能。当你初始化foo时,给它添加类型。示例代码

fn main() {
    let foo: Box<[u32]> = Box::new([1, 2, 3, 4]);
    let bar = foo.into_vec();

    println!("{:?}", bar);
}

那么失去长度信息会更好吗? - fyaa
@fyaa,我认为在你分配切片时不需要长度信息。你不会失去任何东西。这不是一个固定大小的数组,而是一个切片。 - evilone
切片的长度已编码到指向切片的指针中(请参见 https://dev59.com/dFMH5IYBdhLWcg3w4E3k)。没有丢失任何信息。 - U007D

8

你链接的文档是关于切片的,即[T],而你拥有的是长度为4的数组:[T; 4]

然而,你可以简单地将它们转换,因为长度为4的数组有点像切片。这样做是可行的:

let foo = Box::new([1, 2, 3, 4]);
let bar = (foo as Box<[_]>).into_vec();

很奇怪的是,在impl Vec<T>中可以定义一个完全不同的自身类型Box<[T]>的方法。这个有文档记录吗?https://doc.rust-lang.org/std/vec/struct.Vec.html#method.into_vec - starblue
据我所见,这里使用的方法是:http://doc.rust-lang.org/std/primitive.slice.html#method.into_vec - Thierry
@Thierry 也许,然后将 Box 添加到 Self 就像引用一样。在 Vec 上的那个仍然很奇怪。 - starblue

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接