arrays rust println

arrays - ¿Por qué println! ¿funciona solo para matrices con una longitud inferior a 33?



rust (1)

En Rust, esto funciona:

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

pero esto no:

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

Error de compilación:

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`

Supongo que la función std::fmt::Debug alguna manera detecta tipos de hasta 32 elementos, pero luego descarta su detección. ¿O por qué no funciona?


Lamentablemente, Rust aún no admite enteros como parámetros genéricos. Por lo tanto, no es fácil implementar un rasgo (como Debug ) para cada matriz [T; N] [T; N] Actualmente, la biblioteca estándar utiliza una macro para implementar fácilmente el rasgo para todas las longitudes hasta 32.

Para generar la matriz, puede convertirla fácilmente en un segmento ( &[T] ) de esta manera:

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

Por cierto: normalmente puede obtener un segmento de una matriz simplemente con el prefijo & , pero los argumentos println funcionan un poco diferente, por lo que debe agregar el índice de rango completo [..] .

Es probable que la situación mejore en el futuro. RFC 2000: Const Generics ya ha sido aceptado y mayormente implementado en el compilador. Permitiría bloques impl genéricos a lo largo de la matriz. Puede realizar un seguimiento del estado de implementación y estabilización en el problema de seguimiento correspondiente .