Сегодня вышел Rust 1.25.0 (2018-03-29).
Rust это системный язык программирования, нацеленный на надёжность, скорость и параллельное выполнение.
Если вы имеете предыдущую версию Rust, установленную через rustup
, для получения версии 1.25.0 достаточно ввести в терминале:
$ rustup update stable
Что нового в 1.25.0 stable
Синтаксис
- стабилизирован атрибут #[repr(align(x))]; RFC 1358
Данный атрибут позволяет указывать
выравнивание
(alignment) для структур:struct Number(i32); assert_eq!(std::mem::align_of::<Number>(), 4); assert_eq!(std::mem::size_of::<Number>(), 4); #[repr(align(16))] struct Align16(i32); assert_eq!(std::mem::align_of::<Align16>(), 16); assert_eq!(std::mem::size_of::<Align16>(), 16);
- добавлена возможность указывать вложенные группы при использовании инструкции импорта
use
;Раньше:
use std::fs::File; use std::io::Read; use std::path::{Path, PathBuf};
Теперь:
// on one line use std::{fs::File, io::Read, path::{Path, PathBuf}}; // with some more breathing room use std::{ fs::File, io::Read, path::{ Path, PathBuf } };
- можно использовать `|` в начале ветки сопоставления.
enum Foo { A, B, C } fn main() { let x = Foo::A; match x { | Foo::A | Foo::B => println!("AB"), | Foo::C => println!("C"), } }
Компилятор
- Апгрейд с LLVM 4 до LLVM 6 (еще один шажок к поддержке AVR);
- Добавлена опция
-C lto=val
; - Добавлена цель сборки (target)
i586-unknown-linux-musl
.
Библиотека
- реализован типаж `Send` для `process::Command` на Unix;
- реализованы `PartialEq` и `Eq` для `ParseCharError`;
- `UnsafeCell::into_inner` теперь не `unsafe`;
- добавлен в `libstd` код, специфичный для `CloudABI`;
- `Float::{from_bits, to_bits}` теперь доступны в `libcore`;
- реализован `AsRef<Path>` для `Component`;
- реализован `Write` для `Cursor<&mut Vec<T>>`;
- `Duration` перемещён из `libstd` в `libcore` (для возможности использования в контексте `no_std`).
Стабилизированные API
- Location::column;
- ptr::NonNull;
Наиболее значимое событие — это
std::ptr::NonNull<T>
. Этот тип похож на*mut T
, но является ненулевым (non-null) и ковариантным. Если вкратце,NonNull<T>
гарантирует, что никогда не будет равен null, а это означает, чтоOption<NonNull<T>>
имеет тот же размер, что и*mut T
. Если вы создаете структуру данных с небезопасным кодом,NonNull<T>
зачастую будет правильным выбором для вас.Следующие функции теперь могут быть использованы в константных выражениях, т.е. например,
static MINUTE: Duration = Duration::from_secs(60);
: - Duration::new;
- Duration::from_secs;
- Duration::from_millis;
- Duration::from_micros;
- Duration::from_nanos.
Cargo
- `cargo new` больше не удаляет префикс `rust` и суффикс `rs`;
- `cargo new` теперь по умолчанию создаёт пакет приложения (binary crate), а не библиотечный пакет (library crate).
Разное
Примечания по поводу совместимости
- удалён net::lookup_host;
- `rustdoc` переключён на `pulldown` как дефолтный рендерер Markdown;
- borrow checker иногда неправильно разрешал перекрывающиеся заимствования вокруг операций индексирования (см. #47349). Это было исправлено (что также позволило использовать некоторый корректный код, который вызывал ошибки (например, #33903 и #46095);
- удалён устаревший нестабильный атрибут `#[simd]`.
>>> Подробности