为什么我不能写一个和Box::new相同类型的函数?
Why can't I write a function with the same type as Box::new?
如果我编写的函数接受一个类型为 [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 在操场上
&[f32]
切片的大小也过大.. 这也是它被允许的原因。
正如 Lukas 在评论中指出的那样,切片是 "fat pointer" (You can read about Dynamically Sized Types in the Nomicon)。切片胖指针由一个指向一段数据的指针和一个表示该数据有多大的值组成。
如果我编写的函数接受一个类型为 [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 在操场上
&[f32]
切片的大小也过大.. 这也是它被允许的原因。
正如 Lukas 在评论中指出的那样,切片是 "fat pointer" (You can read about Dynamically Sized Types in the Nomicon)。切片胖指针由一个指向一段数据的指针和一个表示该数据有多大的值组成。