为什么我不能编写与Box :: new相同类型的函数?

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)

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

Sim*_*ead 8

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

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

一个&[f32]片的大小太..这就是为什么它被允许也.

正如Lukas在评论中指出的那样,切片是一个"胖指针"(你可以在Nomicon中读到动态大小的类型).切片胖指针由指向一段数据的指针和表示该数据大小的值组成.

  • @ apt1002该类型约束导致`Box <[f32; 3]>`强制执行`Box <[f32]>`.您可以通过尝试使用明显不正确的类型来证明这一点:`let b :()= Box :: new([1.0,2.0,3.0]);`会产生错误,告诉您右侧是`Box <[{浮}; 3]>`(因为此时浮点文字不是任何特定的浮点类型). (3认同)