Rust 1.10
Анонсирована очередная версия языка программирования 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
и Into для VecDeque; - 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 и прочее.
mozilla, rust