Inicialización de estructuras en Rust: inicio rápido y trucos avanzados

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Introducción: ¿Por qué la inicialización de estructuras en Rust no es aburrida?

\n\n

Si 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!».

\n\n

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\n

En 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\n

1. Forma clásica: nombrado explícito de campos

\n\n

Empecemos por lo básico. Supongamos que tenemos una estructura User:

\n\n
struct User {\n    username: String,\n    email: String,\n    sign_in_count: u64,\n    active: bool,\n}
\n\n

La inicialización estándar se ve así:

\n\n
let user1 = User {\n    email: String::from("someone@example.com"),\n    username: String::from("someusername123"),\n    active: true,\n    sign_in_count: 1,\n};
\n\n

Todo 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.

\n\n

La buena noticia: Rust también lo siente. Y encontró una solución.

\n\n

2. Field Init Shorthand: cuando el nombre de la variable coincide con el campo

\n\n

A 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\n
let 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\n

Bonito, ¿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.

\n\n

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\n

3. Struct Update Syntax: copiar una estructura con cambios

\n\n

Supongamos que ya tenemos user1 y queremos crear user2, cambiando solo el email. ¿Tendremos que reescribir todos los campos? ¡No!

\n\n
let user2 = User {\n    email: String::from("another@example.com"),\n    ..user1  // los campos restantes se toman de user1\n};
\n\n

El 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.

\n\n

Esta sintaxis ahorra muchas líneas cuando trabajas con la inicialización de estructuras en Rust basada en datos existentes.

\n\n

4. 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:

\n\n
#[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