2016-11-14 5 views
2

私はタイプ[f32]&[f32]を例えばではなく)の一つの引数を取る関数を記述する場合、私はエラーを取得:Box :: newと同じ型の関数を書くことができないのはなぜですか?

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

ドキュメントは[f32]はコンパイル時知られていないため、これがあると言いますサイズ。合理的な制限。けっこうだ。

ただし、このタイプの標準ライブラリには少なくとも1つの関数があります。ここに私はそれを呼んでいます:

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

これはどのようにして私のコードではなく、標準ライブラリで許可されていますか?関連する違いは何ですか? (the sourceには明らかな魔法はありません)。

答えて

7

[f32]は、ただし、[1.0, 2.0, 3.0]のサイズは... [f32; 3]です。

標準ライブラリコード[f32; 3]サイズの配列でコンパイルすると、それはTとなります。

サイズの配列を自分で受け入れるには、あなたが同じことを行うことができます:遊び場

fn my_func(array: [f32; 3]) { 
    // Implementation here 
} 

my_func([1.0, 0.0, 0.0]); 

Click here to see a working sample&[f32]スライスは、それがまた、許可されている理由である。..あまりにも大きさです。

ルーカスはコメントの中で指摘しているように、スライスは「ファットポインタ」(You can read about Dynamically Sized Types in the Nomicon)です。スライス・ファット・ポインタは、データへのポインタとそのデータの大きさを表す値から構成されます。

+0

私は 'b'に明示的な型を与えました。それはBoxがインスタンス化される型を決定しませんか? – apt1002

+3

@ apt1002そのタイプ制約により、 'Box <[f32; 3]>'は 'Box <[f32]>'に変換されます。 'let b:()= Box :: new([1.0、2.0、3.0]);'は、右辺が 'Box 'であることを示すエラーを生成します<[{フロート}; 3]> '(浮動小数点数はこの時点で浮動小数点型ではないので)。 –

+1

*そのサイズは参照のサイズ* - >いいえ、それは太いポインタなので、サイズはポインタの2倍です。 –

関連する問題