ππ¦ Just an hour ago, #rustlang 1.66.0 was released!
As usual, here's a thread with some of the highlights. π§΅
1/12
Rust 1.66 comes with std::hint::black_box(), a function that does nothing. However, the compiler tries its very best to pretend it doesn't know what it does.
It is useful in benchmarks, to prevent the compiler from optimizing your entire benchmark away.
2/12
The Option type got a new method: Option::unzip(). It's basically the opposite of Option::zip(): it splits an Option of a pair into a pair of Options.
3/12
There are now methods on the integer types for mixing signed and unsigned integers in addition and subtraction.
For example, i64::checked_add_unsigned() adds a u64 to a i64, but will return None when the value would overflow.
4/12
BTreeSet and BTreeMap now have functions for working with the first and last element. These structures keep their elements sorted, so these methods allow easy access to the largest and smallest ones.
5/12
The file descriptor types and traits are now available from std::os::fd, instead of only from std::os::unix::io and std::os::wasi::io. This makes it a bit easier to make software that runs on both Unix and Wasi.
6/12
As of today's Rust release, inline assembly supports `sym` operands to refer to symbols from within the assembly code.
7/12
Patterns now support half open ..=X ranges:
8/12
Procedural macros can now access the original source text through Span::source_text(), which is useful for diagostics (and horrible macro crimes).
9/12
Tuple and struct enum variants can now also be assigned a discriminant, just like unit variants, when using the #[repr] attribute on the enum to give it a predictable layout.
10/12
With the release of version 1.66, Cargo now has a built-in "cargo remove" command, to complement the "cargo add" command.
11/12
And that's the end of today's Rust release thread. π
For a more complete list of changes in Rust 1.66, check out the release notes:
Rust now has a new async-related trait: IntoFuture.
The .await syntax be used on anything that implements IntoFuture. (Similar to how, with a for loop, you can iterate over anything that implements IntoIterator.)
This allows types to provide easier async interfaces.
2/15
Today's Rust release also comes with two more async-related tools:
The std::future::poll_fn function allows you to easily create a future from a closure (like iter::from_fn for iterators).
The std::task::ready!() macro extracts a Poll::Ready, or returns early on Pending.
Cargo now has 'cargo add' built-in: a (sub)command to add a crate to your Cargo.toml. It automatically looks up the latest version, and shows you the available features of the crate.
See `cargo add --help` for more details.
2/9
On Linux and several BSDs, std::sync's Mutex, RwLock, and Condvar now no longer do any allocations. They used to be (heap-allocated) wrappers around pthread lock types, but have been replaced by a minimal, more efficient, futex-based implementations.
π¦ As of Rust 1.62 (going into beta this week), std::sync::Mutex, RwLock, and Condvar no longer do any allocations on Linux. π
Benchmarking locks is extremely tricky, as their performance depends heavily on the exact use case, but there are very noticable differences:
std's Mutex basically used to contain a Pin<Box<pthread_mutex_t>>, where the pinned Box was only necessary because pthread_mutex_t is not guaranteed movable. The new Mutex no longer uses pthread, and instead directly uses the futex syscall, making it smaller and more efficient.
Also, the new RwLock on Linux prefers writers, which prevents writer starvation. pthread_rwlock_t prefers readers by default, to allow recursive read locking. Rust's RwLock does not make recursion guarantees, and on several platforms (including Windows) already preferred writers.
Newly stabilized in the standard library is File::options(). It's identical to OpenOptions::new(), but you don't have to import the OpenOptions type separately from the File type.