为什么println!仅适用于长度小于33的数组?

时间:2015-10-09 11:14:12

标签: arrays rust println

在Rust中,这有效:

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个元素的类型,但随后丢弃了它的检测。或者为什么它不起作用?

1 个答案:

答案 0 :(得分:24)

可悲的是,Rust还不支持将整数作为通用参数。因此,为每个数组Debug实现特征(如[T; N])并不容易。目前,标准库使用宏来轻松实现最长为32的所有长度的特征。

要输出数组,您可以通过这种方式轻松将其转换为切片(&[T]):

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

顺便说一下:通常你可以通过前缀&从数组中获取一个切片,但是println参数的工作方式有点不同,所以你需要添加全范围索引{{1} }。

未来情况可能会有所改善。 RFC 2000: Const Generics已被接受,并允许[..]块在数组长度上通用。您可以在the corresponding tracking issue上跟踪实施和稳定的状态。