4

如果我编写一个接受一个类型参数的函数[f32](而不是 eg &[f32]),我会得到一个错误:

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

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

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

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

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

4

1 回答 1

9

[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]);

单击此处查看Playground 上的工作示例

切片的&[f32]大小也是如此。这也是允许它的原因。

正如 Lukas 在评论中指出的那样,切片是一个“胖指针”(您可以在 Nomicon 中阅读有关动态大小的类型)。切片胖指针由指向一段数据的指针和一个表示该数据有多大的值组成。

于 2016-11-14T02:17:40.617 回答