Historia del tema:
Rust sigue la filosofía de la inicialización explícita. Para algunas colecciones estándar y tipos genéricos, a menudo se requiere tener un valor "por defecto". Sin embargo, para estructuras complejas a menudo es ambiguo cómo crearlas sin parámetros. Para este propósito se introdujo el trait Default, que define un constructor estándar.
Problema:
Para escribir contenedores y algoritmos genéricos donde a veces se espera un valor por defecto (por ejemplo, en Option::unwrap_or_default, Vec::resize), se necesita un mecanismo para crear instancias sin pasar argumentos. Pero no todos los tipos son adecuados para tal constructor; a veces el valor por defecto puede no ser obvio y ser peligroso.
Solución:
default() que devuelve una instancia (generalmente "vacía", zeroed o con precondiciones).Ejemplo de código:
#[derive(Default, Debug)] struct Config { retries: u32, verbose: bool, } fn main() { let cfg = Config::default(); println!("{:?}", cfg); }
Características clave:
¿Se llamará forzosamente a Default::default para Option<T>, si T: Default?
No, Optional no llama a default para T automáticamente; unwrap_or_default se llama explícitamente.
¿Se pueden establecer parámetros con valor por defecto a través del trait Default en el constructor de una estructura?
No, Default crea toda la estructura en su totalidad, los campos individuales no se pueden sustituir con el sintaxis normal del constructor.
¿Puede derive(Default) fallar para una estructura con campos que no implementan Default?
Sí, derive(Default) solo funciona si todos los campos de la estructura implementan Default.
Config c Default, donde el puerto del servidor es 0 (valor por defecto no válido). El programa se inicia inesperadamente en el puerto incorrecto.
Pros:
Contras:
Default para una estructura de configuración con valores seguros y consensuados (retries=3, verbose=false).
Pros:
Contras: