gpt4 book ai didi

rust - 为什么我不能写一个和 Box::new 类型相同的函数?

转载 作者:行者123 更新时间:2023-11-29 07:56:41 25 4
gpt4 key购买 nike

如果我编写的函数接受一个类型为 [f32] 的参数(与例如 &[f32] 相对),我会得到一个错误:

the trait bound `[f32]: std::marker::Sized` is not satisfied

文档说这是因为 [f32] 没有编译时已知的大小。一个合理的限制。很公平。

但是,标准库中至少有一个函数是这种类型的。我这样调用它:

let b: Box<[f32]> = Box::new([1.0, 2.0, 3.0]);

为什么在标准库中允许这样做而不是在我的代码中?相关的区别是什么? (the source 中没有明显的魔法)。

最佳答案

[f32] 未调整大小。但是,[1.0, 2.0, 3.0] 的大小...它的类型是 [f32; 3]

这就是 T 用标准库代码编译时的样子,一个 [f32; 3] 大小的数组。

要自己接受一个大小的数组,你可以这样做:

fn my_func(array: [f32; 3]) {
// Implementation here
}

my_func([1.0, 0.0, 0.0]);

Click here to see a working sample在 Playground 上

&[f32] 切片也有大小.. 这也是它被允许的原因。

正如 Lukas 在评论中指出的那样,切片是一个“胖指针”(You can read about Dynamically Sized Types in the Nomicon)。切片胖指针由一个指向一段数据的指针和一个表示该数据有多大的值组成。

关于rust - 为什么我不能写一个和 Box::new 类型相同的函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40580978/

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