为什么"大"数组没有实现std :: fmt :: Debug?

Lud*_*Lud 3 rust

我可以打印Debug以下数组:

fn main() {
    let array = [0; 5];
    println!("{:?}", array);
}
Run Code Online (Sandbox Code Playgroud)

但是,如果大小更大,假设它是50,则std::fmt::Debug默认情况下不会实现该特征:

fn main() {
    let array = [0; 50];
    println!("{:?}", array);
}
Run Code Online (Sandbox Code Playgroud)

编译错误:

错误[E0277]:[{integer}; 50]: std::fmt::Debug不满足特征限制

为什么std::fmt::Debug某些大小的数组没有实现这种特性?

Ale*_*ing 6

来自https://doc.rust-lang.org/std/primitive.array.html:

如果元素类型允许,则大小为0到32(包括)的数组实现以下特征:

  • 克隆(仅限T:复制)
  • 调试
  • IntoIterator(为&[T; N]和&mut [T; N]实现)
  • PartialEq,PartialOrd,Eq,Ord
  • 哈希
  • AsRef,AsMut
  • 借,BorrowMut
  • 默认

对大小N的这种限制是存在的,因为Rust还不支持在数组类型大小上通用的代码.[美孚; 3]和[Bar; 3]是相同通用类型的实例[T; 3],但是[Foo; 3]和[Foo; 5]是完全不同的类型.作为权宜之计,特征实现是静态生成的,大小为32.

如果元素类型为Copy,则任何大小的数组都是Copy.这是有效的,因为编译器特别知道复制特征.

  • 我希望2017年将是Rust获得整体通用参数的一年(如果它得到的不仅仅是积分,我真的很喜欢,但积分将非常有用). (3认同)
  • 在当前的 rust 版本中,定义已更改为“如果元素类型允许,任何大小的数组都实现以下特征:Debug、IntoIterator(为 &[T; N] 和 &mut [T; N] 实现)、PartialEq、PartialOrd 、Eq、Ord、Hash、AsRef、AsMut、Borrow、BorrowMut”,仅 Default 特征仍限制为 32 个元素数组。 (2认同)