syntax - programming - rust latest version
¿Qué significa "dyn" en un tipo? (1)
TL; DR: es una sintaxis para especificar el tipo de objeto de un rasgo y debe preferirse por razones de claridad.
Desde Rust 1.0, los rasgos han llevado una doble vida. Una vez que se ha declarado un rasgo, se puede usar como un rasgo o como un tipo:
// As a trait
impl MyTrait for SomeType {}
// As a type!
impl MyTrait {}
impl AnotherTrait for MyTrait {}
Como puedes imaginar, este doble significado puede causar cierta confusión.
Además, dado que el tipo
MyTrait
es un tamaño sin tamaño / tamaño dinámico, esto puede exponer a las personas a mensajes de error muy complejos.
Para mejorar este problema,
RFC 2113
introdujo la sintaxis de
dyn
.
Esta sintaxis está disponible a partir de Rust 1.27:
use std::{fmt::Display, sync::Arc};
fn main() {
let display_ref: &dyn Display = &42;
let display_box: Box<dyn Display> = Box::new(42);
let display_arc: Arc<dyn Display> = Arc::new(42);
}
Esta nueva palabra clave es paralela a la sintaxis del
impl Trait
y se esfuerza por hacer que el tipo de
objeto del rasgo sea
más claramente distinto de la sintaxis del rasgo "simple".
Es probable que en una edición posterior de Rust , la sintaxis básica quede en desuso y luego se elimine.
- ¿Por qué implementar métodos en un rasgo en lugar de como parte del rasgo?
- ¿Qué hace que algo sea un "objeto de rasgo"?
Recientemente he visto código usando la palabra clave
dyn
:
fn foo(arg: &dyn Display) {}
fn bar() -> Box<dyn Display> {}
¿Qué significa esta sintaxis?