Introducción: ¿Por qué la inicialización de estructuras en Rust no es aburrida?
\n\nSi alguna vez has escrito en Rust, seguramente te has encontrado con el momento en el que quieres decir: «¿Por qué tengo que escribir una y otra vez field: field? ¡Es obvio!».
Sí, Rust es un lenguaje severo, estricto e increíblemente expresivo. Pero incluso en él hay espacio para el azúcar sintáctico, que hace que el código sea más corto, más limpio y más agradable a la vista. Esto se aplica especialmente a la inicialización de estructuras — esa rutina que hacemos decenas de veces al día.
\n\nEn este artículo no solo responderemos a la popular pregunta de Stack Overflow: «Is there a faster/shorter way to initialize variables in a Rust struct?». Analizaremos todas las formas, desde las básicas hasta las avanzadas, y mostraremos cómo escribir código que sea rápido, legible e «idomático en Rust» (idiomatic Rust).
\n\n¿Listo para acelerar tu trabajo con Rust struct? ¡Allá vamos!
\n\n1. Forma clásica: nombrado explícito de campos
\n\nEmpecemos por lo básico. Supongamos que tenemos una estructura User:
struct User {\n username: String,\n email: String,\n sign_in_count: u64,\n active: bool,\n}\n\nLa inicialización estándar se ve así:
\n\nlet user1 = User {\n email: String::from("someone@example.com"),\n username: String::from("someusername123"),\n active: true,\n sign_in_count: 1,\n};\n\nTodo es honesto, todo es explícito. Pero cuando tienes 10-15 campos y los nombres de las variables coinciden con los nombres de los campos, esto comienza a molestar. Escribes email: email y te sientes como un burócrata llenando un formulario.
La buena noticia: Rust también lo siente. Y encontró una solución.
\n\n2. Field Init Shorthand: cuando el nombre de la variable coincide con el campo
\n\nA partir de Rust 1.17, puedes usar una notación abreviada si el nombre de la variable coincide con el nombre del campo de la estructura. Esto se llama field init shorthand.
\n\nlet email = String::from("someone@example.com");\nlet username = String::from("someusername123");\n\nlet user1 = User {\n email, // en lugar de email: email\n username, // en lugar de username: username\n active: true,\n sign_in_count: 1,\n};\n\nBonito, ¿verdad? Rust entiende por sí mismo que email es tanto la variable como el campo. Este truco es especialmente útil cuando pasas parámetros a una función que ya tienen nombres significativos.
Cuándo usarlo: siempre que el nombre de la variable coincida con el nombre del campo. No es solo «más rápido de escribir», es Rust idiomático.
\n\n3. Struct Update Syntax: copiar una estructura con cambios
\n\nSupongamos que ya tenemos user1 y queremos crear user2, cambiando solo el email. ¿Tendremos que reescribir todos los campos? ¡No!
let user2 = User {\n email: String::from("another@example.com"),\n ..user1 // los campos restantes se toman de user1\n};\n\nEl operador .. es la struct update syntax. Le dice al compilador: «Toma todos los campos restantes de user1». Importante: después de esto, user1 será parcialmente movido (si los campos no implementan Copy), así que ten cuidado con la propiedad.
Esta sintaxis ahorra muchas líneas cuando trabajas con la inicialización de estructuras en Rust basada en datos existentes.
\n\n4. Trait Default: inicialización con valores por defecto
\n\n¿Y si la mayoría de los campos deben tener valores estándar? Por ejemplo, ¿active: true y sign_in_count: 0? Puedes implementar el trait Default:
#[derive(Default)]\nstruct User {\n username: String,\n email: String,\n active: bool,\n sign_in_count: u64,\n}\n\n// Ahora:\nlet user_default = User::default();\n// username: "", email: "", active: false, sign_in_count: 0\n\n¡Pero espera!
Blogs
Book Recommendations
Leer también