Why does println! work only for arrays with a length less than 33?

匿名 (未验证) 提交于 2019-12-03 01:23:02

问题:

In Rust, this works:

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

but this doesn't:

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

Compile error:

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` 

I assume that the std::fmt::Debug function somehow detects types up to a length of 32 elements, but then drops it's detection. Or why doesn't it work?

回答1:

Sadly, Rust does not support integers as generic parameters yet. Therefore it's not easy to implement a trait (like Debug) for every array [T; N]. Currently, the standard library uses a macro to easily implement the trait for all length up to 32.

To output the array, you can easily convert it to a slice (&[T]) this way:

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

By the way: Normally you can obtain a slice from an array by simply prefixing &, but println arguments work a bit different, so you need to add the full range index [..].



标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!