2. Closures in Rust 2021 will capture only the fields of an object you use, instead of the entire object. This should result in fewer fights with the borrow checker:
3/17
3. In Rust 2021, `$x:pat` in macro_rules now accepts patterns that include a `|`, making your macro rules easier to write:
4/17
4. Specifying `edition = "2021"` in your Cargo.toml implies `resolver = "2"`, when not explicitly given.
5. In Rust 2021, you don't have to import the TryFrom, TryInto and FromIterator traits anymore. They are now part of the prelude, which is automatically imported into all your modules:
6/17
6. The panic!() (and assert) macros in Rust 2021 no longer behave inconsistently when given only one argument. This unblocks a feature that will be available in a few versions from now: implicit format arguments.
7/17
7. We reserved some syntax for identifiers and literals with prefixes in Rust 2021. This syntax doesn't mean anything *yet*, but reserving it means we can start giving meaning to it in the (near?) future:
8/17
And finally the last change that's part of the 2021 edition:
8. Some old syntax that's been deprecated for a while is completely removed in Rust 2021. This means we can use that syntax for something else in the future. (Maybe we can use `...` for variadic generics.)
9/17
Then let's continue with the changes in Rust 1.56 that are available in all editions:
1. Extend<(A, B)> for (Extend<A>, Extend<B>)
It allows splitting an iterator over tuples into separate collections, a bit like the opposite of .zip():
10/17
2. From<array> for BTreeMap, BTreeSet, HashMap, HashSet, VecDeque, LinkedList, and BinaryHeap.
You can now use e.g. BTreeMap::from(..) to make a collection with directly the contents you want:
11/17
3. You can now combine `@` bindings with regular pattern bindings. That means you can now give a name to an object _and give a name to some parts of it_ at the same time:
12/17
4. BufWriter::into_parts()
BufWriter::into_inner() will try to flush the buffer before giving you back the underlying Write object, which can fail.
BufWriter::into_parts() cannot fail and gives you the Write object and the unflushed buffer, so you can handle it manually:
13/17
5. A new .shrink_to() method on Vec, String, PathBuf, VecDeque, HashSet, etc.
This allows you to *reduce* the .capacity() of a collection. It is basically the opposite of .reserve():
14/17
6. const mem::transmute() π¬
You can now use std::mem::transmute to do horrible things in a const fn:
15/17
And finally, a new Cargo feature:
7. You can now specify the minimum supported Rust version in your Cargo.toml:
rust-version = "1.56.0"
If specified, Cargo will give users of your crate a clear error when their version of Rust is too old:
16/17
And that's the end of this thread!β¨
For a more complete list of changes in Rust 1.56, check the release notes:
We already had str::split and str::splitn, which result in an iterator. But when parsing something simple, you often want to split something exactly once. For example, to parse a string containing `key=value`.
2/10
Another one I'm excited about is one of the first features I worked on: std::fmt::Arguments::as_str()
fmt::Arguments is returned by format_args!(), and appears in macros that support formatting.
as_str() allows handling the literal case without special-casing your macro:
I just approved the PR for a very exciting addition to @rustlang 1.53: IntoIterator for arrays ππ¦
Before this change, only references to arrays implemented IntoIterator, which meant you could iterate over &[1,2,3] and &mut [1,2,3], but not over [1,2,3] directly.
1/6
The reason we didn't add it sooner was backwards compatibility. `array.into_iter()` already compiles today, because of the way methods get resolved in Rust. This implicitly calls `(&array).into_iter()`. Adding the trait implementation would change the meaning and break code.
2/6
Technically we consider this type of breakage (adding a trait impl) 'minor' and acceptable. But there was too much code that would be broken by it. Thanks to @LukasKalbertodt, such code results in a warning nowadays, but there's a lot of code that just doesn't get updated.