2015-10-09 4 views
18

、この作品:なぜprintln!長さが33未満の配列に対してのみ動作しますか?錆で

fn main() { 
    let a = [0; 32]; 
    println!("{:?}", a); 
} 

これません:

fn main() { 
    let a = [0; 33]; 
    println!("{:?}", a); 
} 

コンパイルエラー:

error[E0277]: the trait bound `[{integer}; 33]: std::fmt::Debug` is not satisfied 
--> src/main.rs:3:22 
    | 
3 |  println!("{:?}", a); 
    |     ^the trait `std::fmt::Debug` is not implemented for `[{integer}; 33]` 
    | 
    = note: `[{integer}; 33]` cannot be formatted using `:?`; if it is defined in your crate, add `#[derive(Debug)]` or manually implement it 
    = note: required by `std::fmt::Debug::fmt` 

を私はstd::fmt::Debug機能がどうにかまでのタイプを検出することを前提とし長さは32要素ですが、検出が落ちます。それともなぜ機能しないのですか?

答えて

19

悲しいことに、Rustはまだ一般的なパラメータとして整数をサポートしていません。したがって、配列[T; N]ごとに特性(Debugなど)を実装するのは容易ではありません。現在、標準ライブラリは、簡単にスライスに変換することができ、簡単に出力するには32

に配列を、すべての長さアップのための形質を実装するためのマクロを使用しています(&[T])この方法:

let a = [0; 33]; 
println!("{:?}", &a[..]); 

ところで:普通は&の接頭辞で配列からスライスを得ることができますが、println引数は少し違うので、フルレンジインデックス[..]を追加する必要があります。

+4

[マクロ実装へのリンク](https://github.com/rust-lang/rust/blob/b30d8969e86fa2c9dd3b8e2e28ddda2202331f0f/src/libcore/array.rs#L112) - 参考になるかもしれません。 – soon

関連する問題