Announcing Rust 1.80.0
The Rust team just announced the release of Rust 1.80.0.
This article aims to give you a quick recap of the main updates.
To update to this latest version, run:
Key Updates in Rust 1.80.0
LazyCell and LazyLock
These new types delay data initialization until first access.
LazyLock is thread-safe, suitable for static values, while LazyCell is not thread-safe but can be used in thread-local statics.
Example using LazyLock:
use std::time::Instant;
static LAZY_TIME: LazyLock<Instant> = LazyLock::new(Instant::now);
fn main() {
let start = Instant::now();
std::thread::scope(|s| {
s.spawn(|| {
println!(“Thread lazy time is {:?}”, LAZY_TIME.duration_since(start));
});
println!(“Main lazy time is {:?}”, LAZY_TIME.duration_since(start));
});
}
Checked cfg Names and Values
Cargo 1.80 now includes checks for cfg names and values to catch typos and misconfigurations, improving the reliability of conditional configurations.
Example demonstrating cfg check:
println!(“Hello, world!”);
#[cfg(feature = “crayon”)]
rayon::join(
|| println!(“Hello, Thing One!”),
|| println!(“Hello, Thing Two!”),
);
}
Warning output:
—> src/main.rs:4:11
|
4 | #[cfg(feature = “crayon”)]
| ^^^^^^^^^^——–
| |
| help: there is an expected value with a similar name: `“rayon”`
|
= note: expected values for `feature` are: `rayon`
= help: consider adding `crayon` as a feature in `Cargo.toml`
Exclusive Ranges in Patterns
Rust now supports exclusive range patterns (a..b), enhancing pattern matching and reducing the need for separate constants for inclusive endpoints.
Example using exclusive range patterns:
const K: u32 = 10u32.pow(3);
const M: u32 = 10u32.pow(6);
const G: u32 = 10u32.pow(9);
match n {
..K => “”,
K..M => “k”,
M..G => “M”,
G.. => “G”,
}
}
Stabilized APIs
New stable APIs include implementations for Rc and Arc types, enhancements to Duration, Option, Seek, BinaryHeap, NonNull, and more.
Read more
This is just a quick recap. For more details, check out here
Have a great day