apt*_*002 3 rust dynamic-sizing
如果我编写一个带有一个类型参数的函数[f32]
(而不是例如&[f32]
),我会收到一个错误:
the trait bound `[f32]: std::marker::Sized` is not satisfied
Run Code Online (Sandbox Code Playgroud)
文档说这是因为[f32]
没有编译时已知的大小.合理的限制.很公平.
但是,此类型的标准库中至少有一个函数.这是我的称呼它:
let b: Box<[f32]> = Box::new([1.0, 2.0, 3.0]);
Run Code Online (Sandbox Code Playgroud)
为什么在标准库中而不是在我的代码中允许这样做?有什么相关区别?(源中没有明显的魔力).
[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]);
Run Code Online (Sandbox Code Playgroud)
一个&[f32]
片的大小太..这就是为什么它被允许也.
正如Lukas在评论中指出的那样,切片是一个"胖指针"(你可以在Nomicon中读到动态大小的类型).切片胖指针由指向一段数据的指针和表示该数据大小的值组成.