The unique approach of the Rust programming language results in better code with fewer compromises than C, C++, Go, and the other languages you probably use. It also gets updated regularly, often every month.
Where to download the latest Rust version
If you already have a previous version of Rust installed via rustup, you can access the latest version via the following command:
$ rustup update stable
The new features in Rust 1.70
Debuting June 1, 2023, Rust 1.70 enables by default the “sparse” protocol for the Cargo package manager for reading the index from crates.io. This feature had been stabilized in Rust 1.68 but using it with crates.io still required configuration. Users should see substantially improved performance when fetching information from crates.io index.
Also in Rust 1.70, two types have been stabilized for one-time initialization of shared data: OnceCell
and its thread-safe counterpart, OnceLock
. These can be used anywhere that immediate construction is not wanted and perhaps not even possible, such as non-const
data in global variables.
A newly stabilized IsTerminal trait has a single method to determine if a given file descriptor or handle represents a terminal or TTY. This is another case of standardizing functionality that existed in external traits, such as atty
and is-terminal
, using the C library isatty
function on Unix targets and similar functionality elsewhere. Version 1.70 also supports named levels of debug information. Stable and beta builds of Rust no longer will allow unstable test
options, making them truly nightly-only, as documented. Rust 1.70 also stabilizes a number of APIs, such as NonZero*::MIN/MAX
and BinaryHeap::retain
.
The new features in Rust 1.69
Announced April 20, 2023, Rust 1.69 offers no new major features but contains many small improvements, including more than 3,000 commits from more than 500 contributors, the Rust release team said.
Rust 1.29 introduced the cargo fix
subcommand to automatically fix some simple compiler warnings. Since then, the number of warnings that can be fixed automatically has continued to increase. Additionally, support for automatically fixing some simple Clippy warnings has been added. To draw attention to these capabilities, Cargo now will suggest running cargo fix
or cargo clippy --fix
when it detects warnings that are automatically fixable:
warning: unused import: `std::hash::Hash` --> src/main.rs:1:5 | 1| use std::hash::Hash; | ^^^^^^^^^^^^^^^ | = note: `#[warn(unused_imports)]` on by default warning: `foo` (bin "foo") generated 1 warning (run `cargo fix --bin "foo"` to apply 1 suggestion)
The full Cargo invocation shown here only is necessary to precisely apply fixes to a single crate. To apply fixes to all default members of a workspace, running cargo fix
with no additional arguments is all that’s necessary.
Also in Rust 1.69, debug information is no longer included in build scripts by default. To boost compilation speed, Cargo now avoids emitting debug information in build scripts by default. There will be no visible effect when build scripts execute successfully. Finally, a number of APIs have been stabilized such as cstr::from_bytes_until_nul
and core::ffi::FromBytesUntilNulError
.
The new features in Rust 1.68
Rust 1.68.0, announced March 9, stabilizes the “sparse” registry protocol for the Cargo package manager for reading the index of crates, along with infrastructure at http//index.crates.io/ for those published in the primary crates.io registry. The previous Git protocol, still the default, clones a repository that indexes all crates available in the registry. However, the Git protocol has begun to hit scaling limitations, with delays while updating the repository. The new protocol is expected to improve performance when accessing crates.io.
To use the sparse protocol with crates.io, set the environment variable CARGO_REGISTRIES_CRATES_IO_PROTOCOL=sparse
, or edit your .cargo/config/toml
file to add:
[registries.crates-io]protocol = "sparse"
The sparse protocol is set to become the default for crates.io in Rust 1.70.0, which is due in a few months.
Elsewhere in Rust 1.68.0, a new pin!
macro constructs a Pin<&mut T>
from a T
expression, anonymously captured in local state. This often is called stack pinning, but that “stack” also could be the captured state of an async fn
or block. This macro is similar to some crates, but the standard library can leverage Pin
internals and temporary lifetime extension for a more expression-like macro.
Finally, Rust 1.68.0 stabilizes some APIs including {core, std}::pin::pin!
and impl DerefMut for PathBuf
. And Android platform support in Rust now targets NDK r25 toolset.
The new features in Rust 1.67
Rust 1.67, unveiled January 26, adds a compiler warning pertaining to #[must_use]
and async fn
. In Rust, async
functions annotated with #[must_use]
now apply that attribute to the output of the returned impl Future
. The Future
trait already is annotated with #[must_use]
, so types implementing [Future]
are automatically #[must_use]
. Previously there was no way to indicate that the output of the Future
is itself significant and should be used in some way. In Rust 1.67, the compiler now will warn if the output is not used.
Also in Rust 1.67, the implementation of the multi-producer, single-consumer channel of the standard library has been updated. Rust’s standard library has had a multi-producer, single-consumer channel since before version 1.0. With Rust 1.67, the implementation has been switched out to be based on crossbeam-channel
. The release contains no API changes but the new implementation fixes bugs and improves performance and maintainability of the implementation.
Rust 1.67 stabilizes several APIs such as {integer}::checked_ilog
, {integer}::ilog
, and NonZero*::BITS
. A number of other APIs are now stable in const
contexts including char::from_u32
, char::from_digit
, and char::to_digit
. And invalid literals no longer are an error under cfg(FALSE)
.
Note: Rust 1.66.1 stable, released January 10, fixed a situation in which the Cargo package manager was not verifying SSH host keys when cloning dependencies or registry indexes with SSH. This vulnerability was tracked at cve.org, with more information in the advisory.
The new features in Rust 1.66
Introduced December 15, 2022, Rust 1.66 enables enums with integer representations to now use explicit discriminants, even when they have fields. Previously, developers could use explicit discriminants on enums with representations, but only if none of their variants had fields. Explicit discriminants are useful when passing values across language boundaries where the representation of the enum must match in both languages.
Also in Rust 1.66:
- A newly stabilized
black_box
function takes a passed value and passes it right back. The compiler treatsblack_box
as a function that could do anything with its input and return any value. This is useful for disabling optimizations when you don’t want them to occur, such as during benchmarking or when examining the machine code the compiler produces. - Developers can use
cargo remove
to remove dependencies. Rust 1.62 introducedcargo add
, a command line utility to add dependencies to a project. - Developers now can use
..=x
ranges in patterns. - Linux builds now optimize the rustc front end and LLVM back end with LTO and BOLT, respectively, improving runtime performance and memory usage.
- APIs have been stabilized such as
proc_macro::Span::source_text
andOption::unzip
.
The new features in Rust 1.65
Rust 1.65 was introduced November 3, 2022. With this release, generic associated types (GATs), a highly anticipated feature that has been in the works for several years, are finally introduced. GATs allow developers to define lifetime, type, and const generics on associated types. GATs enable patterns that were not previously possible in Rust.
Also in Rust 1.65:
- A new type of
let
statement is introduced,let-else
, with a refutable pattern and a divergingelse
block that executes when that pattern does not match. - Plain block expressions now can be labeled as a
break
target, terminating that block early. - To improve compilation, support for splitting debug information is now stable for use on Linux, after being supported on macOS since Rust 1.51. With this capability,
-Csplit-debuginfo=unpacked
will split debuginfo into multiple .dwo DWARF object files, while-Csplit-debuginfo=packed
will produce a single .dwp DWARF package along with an output binary with all debuginfo packaged together. - APIs have been stabilized such as
std::backtrace::Backtrace
,Bound::as ref
, andstd::io::read_to_string
. - MIR (mid-level intermediate representation) inlining now is enabled for optimized compilations, improving compile times for real world crates.
- When scheduling builds, Cargo now sorts the queue of pending jobs, improving performance.
The new features in Rust 1.64
Rust 1.64.0, unveiled September 22, 2022, stabilizes the IntoFuture
trait, to enhance .await
and improve APIs. IntoFuture
is similar to the IntoIterator
trait, but instead of supporting for … in …
loops, IntoFuture
changes how .await
works.
With IntoFuture
, the .await
keyword can await more than just features; it can await anything that can be converted into a Future
via IntoFuture
, to help make APIs more user-friendly. For the future, the developers of Rust hope to simplify development of new named futures by supporting impl Trait
in type
aliases. This should make implementing IntoFuture
easier by simplifying the type
alias signature and make it more performant by removing the Box
from the type
alias.
Also in Rust 1.64:
- The language provides all
c_*
type aliases incore::ffi
, as well ascore::ffi::CStr
, for working with C strings. Rust 1.64 also providesalloc::ffi::CString
for working with owned C strings using only thealloc
crate rather than the fullstd
library. - rust-analyzer, an implementation of the Language Server protocol for Rust, now is included as part of the collection of tools included with Rust. This makes it easier to download and access rust-analyzer and makes it available on more platforms. The tool is available as a rustup component and can be installed with the command
rustup component add rust_analyzer
. - When working with collections of related libraries or binary crates in one Cargo workspace, developers now can avoid duplication of common field values between crates, such as common version numbers or repository URLs.
- The memory layouts of
Ipv6Addr
,Ipv4Addr
,SocketAddrV4
, andSocketAddrV6
have been changed to be more memory efficient and compact. - Windows builds of the Rust compiler now use profile-guided optimization, improving performance.
- A number of methods and trait implementations have been stabilized, including
num::NonZero*::checked_mul
,num::NonZero*::checked_pow
, and many others.
The new features in Rust 1.63
Published August 11, 2022, Rust 1.63 adds scoped threads to the standard library. Scoped threads allow you to spawn a thread by borrowing from the local stack frame. The std::thread::scope
API provides a guarantee that any spawned threads will have exited prior to its returning, allowing for safely borrowing data. Rust 1.63 also enables non-lexical lifetimes (NLL) by default; the feature is now fully stable. NLL is the second iteration of Rust’s borrow checker.
Also in Rust 1.63:
- For I/O safety, wrapper types are provided such as
BorrowedFD
andOwnedFD
, which are marked as#[repr(transparent)]
, meaning thatextern "C"
bindings can take these types to encode ownership semantics. - The
Condvar::New
,Mutex::New
, andRwLock::new
functions are now callable inconst
contexts, to avoid the use of crates such as lazy_static for creating global statics withMutex
,RwLock
, orCondvar
. This builds on work in Rust 1.62 to enable faster and thinner mutexes. - A number of APIs were stabilized including
array::from_fn
,Box::into_pin
, andPath::try_exists
.
The new features in Rust 1.62
Rust 1.62, which arrived June 30, 2022, lets developers add dependencies directly from the command line using cargo add
. This command supports specifying versions and features and also can modify existing dependencies. Rust 1.62 also allows the use of #[derive(Default)] on enums if a default variant is specified.
Other new capabilities in Rust 1.62:
- Rust’s standard library now ships with a raw futex-based implementation of locks on Linux, which is lightweight and does not carry any extra allocation. This addition is part of an effort to improve the efficiency of Rust lock types.
- It is now easier to build OS-less binaries for x86_64, for example when writing a kernel. The x86_64-unknown-none target has been promoted to Tier 2 and can be installed with rustup.
- A number of APIs have been stabilized including bool::then_some, f32::total_cmp, f64::total_cmp, and Stdin::lines.