Rust 为什么可以';我不能写一个与Box::new类型相同的函数吗?

Rust 为什么可以';我不能写一个与Box::new类型相同的函数吗?,rust,dynamic-sizing,Rust,Dynamic Sizing,如果我编写的函数采用一个[f32]类型的参数(与例如&[f32]相反),我会得到一个错误: trait绑定的“[f32]:std::marker::Sized”不满足 文档说这是因为[f32]没有已知的编译时大小。合理的限制。很公平 但是,标准库中至少有一个函数具有此类型。我叫它: let b: Box<[f32]> = Box::new([1.0, 2.0, 3.0]); 让b:Box=Box::new([1.0,2.0,3.0]); 为什么标准库中允许这样做,而我的代码中不

如果我编写的函数采用一个
[f32]
类型的参数(与例如
&[f32]
相反),我会得到一个错误:

trait绑定的“[f32]:std::marker::Sized”不满足
文档说这是因为
[f32]
没有已知的编译时大小。合理的限制。很公平

但是,标准库中至少有一个函数具有此类型。我叫它:

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

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

[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]);
在操场上

&[f32]
切片的大小也已调整。。这就是为什么它也是被允许的


正如卢卡斯在评论中指出的,切片是一个“胖指针”()。Slice-fat指针由一个指向一段数据的指针和一个表示该数据有多大的值组成。

我为
b
给出了一个显式类型。这是否不确定框实例化的类型?@apt1002该类型约束导致
Box
强制到
Box
。您可以通过尝试使用明显不正确的类型来证明这一点:
let b:()=Box::new([1.0,2.0,3.0])
将产生一个错误,告诉您右侧是
(因为此时浮点文本不是任何特定的浮点类型)。它的大小是引用的大小->不,它是一个胖指针,因此大小是指针大小的两倍。@LukasKalbertodt我确实是这个意思,但没有传达它。现在我到家了,我要重新措辞。