Сегодня вышел 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]`.
Rust — это системный язык программирования, нацеленный на безопасность, быстрое и параллельное исполнение программ.
Изменения:
- теперь можно использовать вложенные группы импорта, например:
use std::{fs::File, io::Read}};
; - cargo new теперь генерирует бинарный проект, а не библиотеку;
- cargo doc получил огромный прирост в скорости генерации документации;
- добавлена поддержка i568-unknown-linux-musl;
- стабилизирован API: std::ptr::NonNull<T>;
- компилятор был переведен на использование LLVM 6.