Анонсирована очередная версия языка программирования Rust 1.10, разрабатываемого Mozilla совместно с сообществом.
Улучшения компилятора:
- Добавлен новый тип крейта cdylib, предназначенный для экспорта C API. Основные отличия от dylib:
- отсутствие метаданных;
- разрешено LTO;
- все библиотеки должны быть статически слинкованы;
- экспортируются лишь те символы, которые помечены как extern. Например:
pub fn foo() {} // не экспортируется #[no_mangle] pub extern fn bar() {} // экспортируется
- Добавлена поддержка платформ i586-unknown-linux-gnu, i686-unknown-linux-musl, и armv7-linux-androideabi;
- Снижено потребление памяти на ~100МБ при проверке типов;
- Ускорена проверка T: Sized на 15%;
- Улучшена кодогенерация при #[derive(Copy, Clone)].
Изменения в стандартной библиотеке:
- Повышена скорость создания HashMap путем кеширования случайных ключей, используемых для инициализации RandomState. В случае неудачной инициализации при использовании системного вызова getrandom в линуксе случайные значения будут браться из /dev/urandom;
- iter::Chain::find ускорен в 2 раза;
- Методы f32.abs_sub() и f64.abs_sub() помечены как deprecated;
- Реализовано:
- Default для cell::UnsafeCell, fmt::Error, sync::Condvar, sync::Mutex, sync::RwLock, ffi::CString, ffi::CStr, path::Path;
- Clone для collections::binary_heap::IntoIter;
- Display, Hash и ops::Neg для num::Wrapping;
- From<Vec<T>> и Into<Vec<T>> для VecDeque<T>;
- cmp::Ord и cmp::PartialOrd для cell::Cell и cell::RefCell.
- Стабилизировано:
- unix-сокеты;
- <[_]>::binary_search_by_key;
- fs::Metadata::modified, fs::Metadata::accessed, fs::Metadata::created;
- panic::set_hook, panic::take_hook, panic::PanicInfo, panic::PanicInfo::payload, panic::PanicInfo::location, panic::Location, panic::Location::file, panic::Location::line;
- ffi::CStr::from_bytes_with_nul, ffi::CStr::from_bytes_with_nul_unchecked;
- collections::BtreeMap::values_mut, collections::HashMap::values_mut.
- Добавлены конструкторы для weak-указателей у Rc и Arc;
- На unix-платформах вместо intrinsics::abort используется libc::abort.
Breaking changes!
- AtomicBool теперь преобразуется в bool, а не isize. Демонстрация:
На старых версиях компилятора будет ошибка;
use std::sync::atomic::AtomicBool; use std::mem::transmute; fn main() { let foo: bool = unsafe { transmute(AtomicBool::new(true)) }; }
- time::Duration::new теперь будет паниковать при переполнении;
- String::truncate теперь будет паниковать чуть меньше;
- Небольшое изменение поведения макросов на этапе их парсинга: из :ty и :path следует :block;
- Исправлен баг, связанный с гигиеной макросов. Следующий код будет валидным в устаревших версиях компилятора:
fn main() { let x = true; macro_rules! foo { () => { let x = 0; macro_rules! bar { () => {x} } let _: bool = bar!(); //^ `bar!()` использует первый `x` (который bool), //| а должен использовать второй `x` (который i32). }} foo! {}; }
- Переименование платформ:
- arm-unknown-linux-gnueabi => arm-unknown-linux-gnu;
- arm-unknown-linux-gnueabihf => arm-unknown-linux-gnu;
- armv7-unknown-linux-gnueabihf => armv7-unknown-linux-gnu.
Изменения в менеджере зависимостей Cargo:
- Добавлен флаг --force, -f для подкоманды cargo install, предназначенной для загрузки исходных текстов из crates.io, их компиляции и установки в каталог ~/.cargo/bin. Это нововведение теперь позволит писать:
вместо:
cargo install FOO -f
Однако всё еще невозможно узнать, а требуется ли обновление вообще?cargo uninstall FOO cargo install FOO
- Диагностические сообщения теперь отправляются в stderr, а не в stdout;
- С помощью флагов cargo doc --bin и cargo doc --lib можно выбрать: генерировать html документацию для проекта-приложения src/main.rs или проекта-библиотеки src/lib.rs;
- В конфигурационном файле Cargo.toml, который можно встретить в корневом каталоге каждого проекта, теперь можно указать, каким образом макрос panic!() будет завершать приложение: unwind (по умолчанию) или abort;
- Добавлен флаг cargo --explain FOO, поведение которого идентично rustc --explain FOO: показывает документацию по номеру ошибки;
- В черный список имен крейтов добавлены ключевые слова раста, такие как fn, unsafe, let и прочее.
>>> Подробности