Qué es Rust 2024 Edition
En febrero de 2025, Rust 2024 Edition se lanzó junto con Rust 1.85. Esta es la primera nueva edición en 3 años e incluye mejoras significativas en las funciones del lenguaje y mejoras ergonómicas.
Referencia: The Rust Edition Guide
Nuevas funciones principales
1. gen blocks (generadores)
Permite crear iteradores de forma más intuitiva.
// Método convencional
fn fibonacci() -> impl Iterator<Item = u64> {
let mut a = 0;
let mut b = 1;
std::iter::from_fn(move || {
let result = a;
(a, b) = (b, a + b);
Some(result)
})
}
// Rust 2024: gen blocks
fn fibonacci() -> impl Iterator<Item = u64> {
gen {
let mut a = 0u64;
let mut b = 1;
loop {
yield a;
(a, b) = (b, a + b);
}
}
}
2. async closures
Los closures asíncronos ahora son oficialmente compatibles.
// Antes se necesitaban soluciones alternativas
let fetch = |url| async move {
reqwest::get(url).await
};
// Rust 2024: async closure nativo
let fetch = async |url: &str| {
reqwest::get(url).await
};
// Se puede usar el trait AsyncFn
async fn process<F>(f: F)
where
F: AsyncFn(&str) -> Result<Response, Error>
{
f("https://example.com").await
}
Referencia: Rust Async Book
3. Nuevo prelude
Future e IntoFuture se han añadido al prelude.
// Ya no se necesita importación explícita
// use std::future::Future; // Innecesario
async fn example() -> impl Future<Output = i32> {
async { 42 }
}
4. Mejoras en RPIT (Return Position Impl Trait)
El tipo de retorno se ha vuelto más flexible.
// RPIT lifetime capture rules
fn process<'a>(data: &'a str) -> impl Iterator<Item = &'a str> {
data.split(',')
}
// Rust 2024: + use<> para especificar lifetime explícitamente
fn process<'a>(data: &'a str) -> impl Iterator<Item = &str> + use<'a> {
data.split(',')
}
Cambios en el lenguaje
1. Ámbito de variables temporales en if/while let
// Rust 2024: Ámbito más intuitivo
if let Some(guard) = lock.lock() {
// El ámbito de guard termina aquí
}
// Aquí el lock ya está liberado (prevención de deadlock)
2. Explicitud de atributos unsafe
// Los atributos no seguros requieren especificación explícita
#[unsafe(no_mangle)]
pub extern "C" fn my_function() {}
#[unsafe(link_section = ".custom")]
static DATA: [u8; 4] = [0; 4];
3. static mut queda obsoleto
// Obsoleto
static mut COUNTER: u32 = 0;
// Recomendado: Usar SyncUnsafeCell
use std::cell::SyncUnsafeCell;
static COUNTER: SyncUnsafeCell<u32> = SyncUnsafeCell::new(0);
Referencia: Rust Reference
Mejoras en el toolchain
Mejoras en Cargo
# Cargo.toml
[package]
name = "my-project"
version = "0.1.0"
edition = "2024" # Nueva edición
# Nueva función: dev-dependencies separadas por defecto
[dev-dependencies]
criterion = "0.5"
# Mejoras en el formateador
cargo fmt -- --edition 2024
# Nuevos lints de Clippy
cargo clippy -- -W rust-2024-idioms
Estilo rustfmt 2024
// Nuevo estilo de formato
let result = some_function(
very_long_argument_1,
very_long_argument_2,
);
// Mejora en el formato de métodos encadenados
let output = input
.iter()
.filter(|x| x.is_valid())
.map(|x| x.transform())
.collect::<Vec<_>>();
Migración
Migración automática
# Actualizar edición
cargo fix --edition
# Verificar cambios
cargo check
# Responder a nuevas advertencias
cargo clippy --fix
Actualización de Cargo.toml
[package]
edition = "2024"
rust-version = "1.85"
Referencia: Rust Blog - Edition 2024
Mejoras de rendimiento
Tiempo de compilación
| Elemento | Rust 2021 | Rust 2024 |
|---|---|---|
| Build completo | Base | -15% |
| Incremental | Base | -25% |
| Tiempo de enlace | Base | -20% |
Optimización en tiempo de ejecución
// El compilador optimiza más agresivamente
#[inline(always)]
fn hot_path(x: u32) -> u32 {
// Las mejoras en optimización LLVM
// generan código más eficiente
x.wrapping_mul(31).wrapping_add(17)
}
Compatibilidad del ecosistema
Estado de compatibilidad de crates principales
| Crate | Compatible con 2024 Edition |
|---|---|
| tokio | ✅ |
| serde | ✅ |
| actix-web | ✅ |
| axum | ✅ |
| diesel | ✅ |
Resumen
Rust 2024 Edition ha mejorado significativamente la expresividad y usabilidad del lenguaje.
- gen blocks: Simplificación de la creación de iteradores
- async closures: Mejoras en programación asíncrona
- Refuerzo de seguridad: Explicitud de atributos unsafe
- Toolchain: Reducción del tiempo de compilación
Los proyectos existentes pueden migrarse fácilmente con cargo fix --edition.