私はタイプ[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には明らかな魔法はありません)。
私は 'b'に明示的な型を与えました。それはBoxがインスタンス化される型を決定しませんか? – apt1002
@ apt1002そのタイプ制約により、 'Box <[f32; 3]>'は 'Box <[f32]>'に変換されます。 'let b:()= Box :: new([1.0、2.0、3.0]);'は、右辺が 'Box 'であることを示すエラーを生成します<[{フロート}; 3]> '(浮動小数点数はこの時点で浮動小数点型ではないので)。 –
*そのサイズは参照のサイズ* - >いいえ、それは太いポインタなので、サイズはポインタの2倍です。 –