rust rust-obsolete

rust - ¿Por qué#[derive(Show)] ya no funciona?



rust-obsolete (2)

¡La respuesta es usar {:?} lugar de {} en format! .

Con el Rust de hoy todas las noches, el siguiente código ya no se compila:

#[derive(Show)] enum S { A, B } fn main() { println!("{}", S::A); }

En su lugar, me da el siguiente mensaje de error:

error: the trait `core::fmt::String` is not implemented for the type `S`

¿Hay alguna manera de obtener el viejo comportamiento? Seguramente no puede ser requerido para implementar esto a mano para cada tipo.


El antiguo rasgo Show se dividió en Display y Debug .

  • Display está diseñada para la salida orientada al usuario, y usa el especificador de formato en blanco / predeterminado (por ejemplo, {} , {:.10} {foo:} están usando Display )

  • Debug está diseñada para la depuración / salida interna y utiliza el ? especificador de formato (por ejemplo, {:?} , {:.10?} , {foo:?} están usando Debug )

Por lo tanto, para usar la implementación creada por #[derive(Debug)] se debe escribir println!("{:?}", ...) , en lugar de la antigua println!("{}", ...) .

Solo Debug puede ser #[derive] d, ya que la salida como Foo { x: 1, y: 2 } es poco probable que sea la salida correcta para el usuario, para la mayoría de las situaciones (estoy seguro de que es para algunos, pero luego el programador puede escribir la implementación de Display para hacer eso ellos mismos, o incluso llamar directamente a la implementación de #[derive] Debug #[derive] d Debug #[derive] .

Esto se describió originalmente en RFC 504 y hay una discusión en curso en RFC 565 , lo que hace que las pautas establecidas anteriormente sean más concretas.