2016-11-14 72 views
2

如果我写一个函数,[f32]类型(而不是如&[f32])的一个说法,我得到一个错误:为什么我不能写一个与Box :: new相同类型的函数?

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

文档说,这是因为[f32]没有编译时,已知尺寸。一个合理的限制。很公平。

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

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

这是怎么来的标准库,而不是在我的代码?有什么相关的区别? (the source没有明显的魔法)。

回答

7

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

Click here to see a working sample在操场上

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

正如Lukas在评论中指出的,切片是一个“胖指针”(You can read about Dynamically Sized Types in the Nomicon)。 Slice胖指针由一个指向一段数据的指针和一个代表数据有多大的值组成。

+0

我给了'b'一个明确的类型。这不确定Box实例化的类型吗? – apt1002

+3

@ apt1002该类型约束会导致“Box <[f32; 3]>'强制为”Box <[f32]>'。你可以通过尝试使用明显不正确的类型来证明这一点:'let b:()= Box :: new([1.0,2.0,3.0]);'会产生一个错误,告诉你右边是'Box <[{浮}; 3]>(因为浮点文字在这一点上没有任何特定的浮点类型)。 –

+1

*它的大小是一个引用* - >否,它是一个胖指针,所以它的大小是指针大小的两倍。 –

相关问题