如果我编写一个接受一个类型参数的函数[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]);
为什么标准库允许这样做,而不是我的代码?相关的区别是什么? (没有明显的魔法来源 https://doc.rust-lang.org/src/alloc/up/src/liballoc/boxed.rs.html#225-236).
[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]);
在操场上
An &[f32]
切片的大小也......这就是为什么它也被允许。
正如卢卡斯在评论中指出的那样,切片是一个“胖指针”(您可以在 Nomicon 中阅读有关动态大小类型的信息 https://doc.rust-lang.org/nomicon/exotic-sizes.html)。切片胖指针由一个指向一段数据的指针和一个表示该数据有多大的值组成。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)