Представлен релиз Rust 1.15 — системного языка программирования, нацеленного на безопасную работу с памятью, скорость и параллельное выполнение кода. В этот релиз вошли 1443 патча.
Если у вас уже установлена предыдущая версия Rust, то обновиться до Rust 1.15 очень легко:
$ rustup update stable
Стабильная версия, наконец-то, увидела долгожданную возможность: пользовательские расширения (custom derive)! К примеру, в Rust вы всегда могли автоматически реализовать некоторые типажи через атрибут derive
:
#[derive(Debug)]
struct Pet {
name: String,
}
Debug
для структуры Pet
с использованием минимального кода. Однако, это работало только для тех типажей, которые являлись частью стандартной библиотеки; пользователям это было недоступно. С версии Rust 1.15 это стало доступно. Это значит, что если вы захотите преобразовать структуру Pet
в JSON, это так же просто, как добавить Serde в ваш Cargo.toml
:
[dependencies]
serde = "0.9"
serde_derive = "0.9"
serde_json = "0.9"
Pet
:
#[macro_use]
extern crate serde_derive;
extern crate serde_json;
#[derive(Serialize, Deserialize, Debug)]
struct Pet {
name: String,
}
fn main() {
let pet = Pet { name: String::from("Ferris") };
let serialized = serde_json::to_string(&pet).unwrap();
println!("serialized = {}", serialized);
let deserialized: Pet = serde_json::from_str(&serialized).unwrap();
println!("deserialized = {:?}", deserialized);
}
serialized = {"name":"Ferris"}
deserialized = Pet { name: "Ferris" }
Pet
. Мы можем сделать выборку следующим образом:
// some extern crate and use lines elided here
#[derive(Queryable)]
struct Pet {
name: String,
}
fn main() {
use diesel_demo::schema::pets::dsl::*;
let connection = establish_connection();
let results = pets
.limit(5)
.load::<Pet>(&connection)
.expect("Error loading pets");
println!("Displaying {} pets", results.len());
for pet in results {
println!("{}", pet.name);
}
}
Такого рода библиотеки являются очень мощными, но полагаются на пользовательские расширения для эргономики. Хотя эти библиотеки и работали прежде на стабильной версии Rust, пользоваться ими было не так удобно, и пользователи предпочитали работать на ночных версиях Rust «из-за Serde и Diesel». Пользовательские расширения являются одними из самых широко-используемых возможностей в ночных версиях Rust. Таким образом, в июле прошлого года была начата работа над RFC 1681 для реализации данной возможности. В августе RFC был принят, претерпел большое количество работы и тестирования и, в итоге, был включен в эту стабильную версию.
Научиться писать свои собственные расширения можно в соответствующей главе книги «The Rust Programming Language».
Хотя больше всего упоминаний в рамках данной возможности пришлось на «Serde и Diesel», есть много других крутых возможностей, которые можно делать при помощи пользовательских расширений: например, derive-new. Ещё больше можно увидеть, посмотрев список обратных зависимостей пакета syn. (syn
очень важен для написания пользовательских расширений; для большей информации, смотрите соответствующую главу книги, ссылка на которую приведена выше). Пользовательские расширения были так же известны под названием «макросы 1.1», так как включают в себя основополагающую инфраструктуру для поддержки ещё более мощных возможностей во время компиляции в Rust, под названием «макросы 2.0». Ожидаем услышать больше новостей в этой сфере в будущих релизах.
Другие улучшения
Система сборки Rust была переписана на Rust с использованием Cargo. Теперь это основная система. Процесс был долгим, но наконец-то принес свои плоды. Вся разработка Rust происходит в основной ветке с использованием новой системы сборки, начиная с декабря прошлого года и показывает хорошую работу, ещё один показатель зрелости Cargo. Уже подготовлен PR для полного удаления всех Makefile-ов к версии Rust 1.17. Это позволит rustc напрямую использовать пакеты с crates.io
в компиляторе, как это делается в других проектах на Rust.
В Rust появилась поддержка новых платформ 3 уровня: i686-unknown-openbsd, MSP430, и ARMv5TE.
Компилятор получил ряд улучшений производительности. Работы над производительностью компилятора продолжаются от релиза к релизу и в будущем ожидаются ещё больше улучшений.
В качестве незначительного улучшения, ?Sized теперь можно использовать в утверждении where. Другими словами:
struct Foo<T: ?Sized> {
f: T,
}
struct Foo<T> where T: ?Sized {
f: T,
}
Более подробный список изменений.
Стабилизация библиотек
Алгоритм slice::sort
был переписан и теперь гораздо-гораздо быстрее. Применяется гибридная сортировка слиянием, вдохновленная Timsort. Раньше применялась простая сортировка слиянием.
Если у вас имеется Vec<T>
где T: Copy
с вызовом extend
на него, ваш код теперь будет гораздо быстрее.
Говоря о быстродействии, chars().count()
, chars().last()
, и char_indices().last()
теперь тоже быстры!
Китайские символы теперь правильно отображаются в fmt::Debug.
Также были стабилизированы следующие функции:
- std::iter::Iterator::min_by и std::iter::Iterator::max_by
- std::os::*::fs::FileExt
- std::sync::atomic::Atomic*::get_mut и std::sync::atomic::Atomic*::into_inner
- std::vec::IntoIter::as_slice и std::vec::IntoIter::as_mut_slice
- std::sync::mpsc::Receiver::try_iter
- std::os::unix::process::CommиExt::before_exec
- std::rc::Rc::strong_count и std::rc::Rc::weak_count
- std::sync::Arc::strong_count и std::sync::Arc::weak_count
- std::char::encode_utf8 и std::char::encode_utf16
- std::cell::Ref::clone
- std::io::Take::into_inner
Более подробный список изменений.
Возможности Cargo
Cargo теперь будет выдавать предупреждение, если в верхнем уровне пакета будет файл с названием build.rs
, но не будет аннотации build = "build.rs"
. Это делается из соображения совместимости, так как предполагается использование файла build.rs
в верхнем уровне пакета в качестве файла сборки.
В этом релизе, скрипты в Cargo больше не имеют доступа во время сборки к переменной среды окружения OUT_DIR через env!(«OUT_DIR»). Теперь проверку переменной надо осуществлять во время выполнения через std::env
. Установка значения переменной во время сборки было ошибкой и некорректной при кросс-компиляции. Проверьте свои пакеты и обновите на использование std::env
.
Команда cargo test
получила поддержку флага --all, что полезно при работе с рабочими пространствами.
Появилась возможность статической компиляции с использованием MSVC CRT на Windows, и статического связывания OpenSSL на Mac OS X.
Более подробный список изменений.
Страница благодарности
Для выражения благодарности авторам и помощникам, которые делают Rust лучше, запущена новая инициатива «Thanks!» — страница с благодарностью людям, которые внесли вклад в Rust. Страница доступна по адресу https://thanks.rust-lang.org/ (или https://♥.rust-lang.org). Список авторов и помощников за всё время, по количеству коммитов, можно посмотреть здесь: https://thanks.rust-lang.org/rust/all-time. В Rust 1.15 всего был сделан вклад со стороны 137 людей.
>>> Подробности