Rust's Evolution Accelerates: Key Updates from 1.79 to 1.90 and the 2024 Edition
Share this article
Rust's journey from version 1.79 to 1.90 marks a period of remarkable evolution, punctuated by its 10th anniversary in May 2024 and the landmark release of the Ferrocene Language Specification (FLS)—Rust's first official formal spec. These milestones underscore Rust's maturation from a promising systems language to an enterprise-ready ecosystem. The 2024 edition, released this February, further refines the language’s expressiveness and safety guarantees. Here’s what developers need to know about the most impactful changes.
Language Refinements: Safer Abstractions and Enhanced Expressivity
Rust 1.85 introduced async closures (async |...| { ... }), simplifying asynchronous state machine creation. Trait object upcasting (1.86) now allows implicit coercion to supertraits, easing polymorphic designs:
let trait_obj: &dyn SubTrait = ...;
let super_obj: &dyn SuperTrait = trait_obj; // Now works implicitly
Exclusive range patterns (1.80) enable cleaner integer matching:
match value {
0..10 => println!("Single digit"),
// ...
}
Critical safety upgrades include enforcing unsafe blocks within unsafe fn (2024 edition), debug-mode panic on null pointer dereference (1.86), and abort-on-unwind for extern "C" (1.81). The new &raw operator (1.82) creates raw pointers without unsafe, reducing accidental UB.
Standard Library: Ergonomics and Performance
The long-awaited LazyCell and LazyLock (1.80) provide once_cell-like initialization for static data, reducing external dependencies. Collections gain powerful methods like Vec::pop_if (1.86) and HashMap::extract_if (1.88), while Option::take_if (1.80) streamlines conditional value extraction. For systems programmers, io::pipe (1.87) and File::lock (1.89) enhance I/O control, and strict pointer provenance (1.84) clarifies memory safety invariants. Notably, the Error trait’s migration to core (1.81) expands no_std compatibility.
Tooling: Smarter Workflows and Ecosystem Health
Cargo’s new MSRV-aware resolver (1.84, default in 2024) prevents accidental dependency upgrades that break minimum-supported Rust versions. Developers gain cargo info (1.82) for crate metadata and cargo publish --workspace (1.90) for streamlined releases. Under the hood, Linux builds now default to lld (1.90) for faster linking, and frame pointers in standard library builds (1.79) improve profiling fidelity. Crates.io introduced trusted publishing and README alerts, bolstering supply-chain security.
The Road to Robustness
These updates—coupled with the FLS—signal Rust’s commitment to reliability at scale. The 2024 edition’s lifetime adjustments (e.g., use<..> syntax) and temporary scoping fixes eliminate subtle bugs, while features like #[expect(unused)] (1.81) replace allow-lints with intentional diagnostics. As Rust enters its second decade, it’s not just adding features—it’s refining its foundation for the next generation of safe systems. For developers, this translates to fewer distractions, stronger guarantees, and more time solving real problems.
Source: Recent Rust changes by Nicholas Cameron.