Version 1.32.0 (2019-01-17)
Language
2018 edition
- You can now use the
?
operator in macro definitions. The?
operator allows you to specify zero or one repetitions similar to the*
and+
operators. - Module paths with no leading keyword like
super
,self
, orcrate
, will now always resolve to the item (enum
,struct
, etc.) available in the module if present, before resolving to a external crate or an item the prelude. E.g.#![allow(unused)] fn main() { enum Color { Red, Green, Blue } use Color::*; }
All editions
- You can now match against
PhantomData<T>
types. - You can now match against literals in macros with the
literal
specifier. This will match against a literal of any type. E.g.1
,'A'
,"Hello World"
- Self can now be used as a constructor and pattern for unit and tuple structs. E.g.
#![allow(unused)] fn main() { struct Point(i32, i32); impl Point { pub fn new(x: i32, y: i32) -> Self { Self(x, y) } pub fn is_origin(&self) -> bool { match self { Self(0, 0) => true, _ => false, } } } }
- Self can also now be used in type definitions. E.g.
#![allow(unused)] fn main() { enum List<T> where Self: PartialOrd<Self> // can write `Self` instead of `List<T>` { Nil, Cons(T, Box<Self>) // likewise here } }
- You can now mark traits with
#[must_use]
. This provides a warning if aimpl Trait
ordyn Trait
is returned and unused in the program.
Compiler
- The default allocator has changed from jemalloc to the default allocator on your system. The compiler itself on Linux & macOS will still use jemalloc, but programs compiled with it will use the system allocator.
- Added the
aarch64-pc-windows-msvc
target.
Libraries
PathBuf
now implementsFromStr
.Box<[T]>
now implementsFromIterator<T>
.- The
dbg!
macro has been stabilized. This macro enables you to easily debug expressions in your rust program. E.g.#![allow(unused)] fn main() { let a = 2; let b = dbg!(a * 2) + 1; // ^-- prints: [src/main.rs:4] a * 2 = 4 assert_eq!(b, 5); }
The following APIs are now const
functions and can be used in a
const
context.
Cell::as_ptr
UnsafeCell::get
char::is_ascii
iter::empty
ManuallyDrop::new
ManuallyDrop::into_inner
RangeInclusive::start
RangeInclusive::end
NonNull::as_ptr
slice::as_ptr
str::as_ptr
Duration::as_secs
Duration::subsec_millis
Duration::subsec_micros
Duration::subsec_nanos
CStr::as_ptr
Ipv4Addr::is_unspecified
Ipv6Addr::new
Ipv6Addr::octets
Stabilized APIs
i8::to_be_bytes
i8::to_le_bytes
i8::to_ne_bytes
i8::from_be_bytes
i8::from_le_bytes
i8::from_ne_bytes
i16::to_be_bytes
i16::to_le_bytes
i16::to_ne_bytes
i16::from_be_bytes
i16::from_le_bytes
i16::from_ne_bytes
i32::to_be_bytes
i32::to_le_bytes
i32::to_ne_bytes
i32::from_be_bytes
i32::from_le_bytes
i32::from_ne_bytes
i64::to_be_bytes
i64::to_le_bytes
i64::to_ne_bytes
i64::from_be_bytes
i64::from_le_bytes
i64::from_ne_bytes
i128::to_be_bytes
i128::to_le_bytes
i128::to_ne_bytes
i128::from_be_bytes
i128::from_le_bytes
i128::from_ne_bytes
isize::to_be_bytes
isize::to_le_bytes
isize::to_ne_bytes
isize::from_be_bytes
isize::from_le_bytes
isize::from_ne_bytes
u8::to_be_bytes
u8::to_le_bytes
u8::to_ne_bytes
u8::from_be_bytes
u8::from_le_bytes
u8::from_ne_bytes
u16::to_be_bytes
u16::to_le_bytes
u16::to_ne_bytes
u16::from_be_bytes
u16::from_le_bytes
u16::from_ne_bytes
u32::to_be_bytes
u32::to_le_bytes
u32::to_ne_bytes
u32::from_be_bytes
u32::from_le_bytes
u32::from_ne_bytes
u64::to_be_bytes
u64::to_le_bytes
u64::to_ne_bytes
u64::from_be_bytes
u64::from_le_bytes
u64::from_ne_bytes
u128::to_be_bytes
u128::to_le_bytes
u128::to_ne_bytes
u128::from_be_bytes
u128::from_le_bytes
u128::from_ne_bytes
usize::to_be_bytes
usize::to_le_bytes
usize::to_ne_bytes
usize::from_be_bytes
usize::from_le_bytes
usize::from_ne_bytes
Cargo
- You can now run
cargo c
as an alias forcargo check
. - Usernames are now allowed in alt registry URLs.
Misc
Compatibility Notes
- The argument types for AVX's
_mm256_stream_si256
,_mm256_stream_pd
,_mm256_stream_ps
have been changed from*const
to*mut
as the previous implementation was unsound.