Сегодня было объявлено о выходе очередной версии Rust — языка программирования, разрабатываемого Mozilla.
Основные изменения:
- Язык:
- удален тип float, для чисел с плавающей точкой используются типы f32, f64;
- добавлена возможность включения экспериментальных фич (feature gating) на уровне crate'ов (атрибут '#[feature(foo)]');
- managed boxes (@) теперь включаются с помощью атрибута '#[feature(managed_boxes)]' и в будущем будут удалены. Вместо них используются типы Gc и Rc;
- '@mut' удален, вместо него используется тип 'std::cell::{Cell, RefCell}';
- для возврата в начало цикла используется ключевое слово 'continue' вместо 'loop';
- запрещено изменение строк через индексацию;
- новый синтаксис для создания raw-строк ('r"foo"'). Также можно создать raw-строку с помощью совпадающих хэш-разделителей 'r###«foo»###';
- тип '~fn' теперь пишется как 'proc (args) -> retval { ... }' и может вызываться только однажды;
- тип '&fn' теперь пишется как '|args| -> ret';
- тип '@fn' удален;
- ключевое слово 'do' теперь работает только с procs-лямбдами;
- одноэлементные tuple-like структуры больше не могут быть разыменованы для получения внутреннего значения. Более полное решение для перегрузки оператора разыменования будет предоставлено в будущем;
- атрибут '#[link(...)]' был заменен атрибутом '#[crate_id = «name#vers»]';
- пустые реализации (impl) должны прерываться пустыми фигурными скобками, использование ';' для этого запрещено;
- ключевые слова больше не могут использоваться как lifetime-имена, 'self'-lifetime больше не имеет особого смысла;
- удален макрос 'fmt!';
- удалены макросы 'printf!' и 'printfln!', вместо них используются 'print!' и 'println!';
- pattern matching поддерживает 'mut' ('let (mut x, y) = (1, 2);'
- вместо синтаксиса 'extern mod foo (name = «bar»)' теперь следует использовать 'extern mod foo = «bar»';
- новые зарезервированные слова 'alignof', 'offsetof', 'sizeof';
- макросы могут иметь атрибуты;
- макрос 'asm!' теперь включается feature-gated атрибутом '#[feature(asm)]';
- комментарии могут быть вложенными;
- значения неявно преобразуются к типам trait'ов которые они реализуют (раньше необходимо было явно использовать 'as');
- Библиотеки:
- std: API для 'option' и 'result' был переработан для того чтобы сделать его более простым, консистентным и композабельным;
- std: Полностью заменен модуль 'std::io', включая планировщик. Полностью реализованы File, TCP, UDP, Unix сокеты, именованные каналы и таймеры;
- std: в модуль 'io::util' добавлены полезные реализации типов 'Reader' и 'Writer', включая 'NullReader', 'NullWriter', 'ZeroReader', 'TeeReader';
- std: Тип 'extra::rc' перемещен в std;
- std: Тип 'Gc' в модуле 'gc' заменит тип '@';
- std: Удален тип 'Either';
- std: 'fmt::Default' может быть реализован для любого типа с помощью синтаксиса 'format!(«{}», myfoo)';
- Инструментарий:
- команды 'rust' и 'rusti' были удалены из-за отсутствия поддержки;
- 'rustdoc' был полностью переписан;
- 'rustdoc' может тестировать примеры кода из документации;
- 'rustpkg' может тестировать пакеты с аргументом 'test';
- 'rustpkg' поддерживает произвольные зависимости, включая библиотеки на C;
- улучшен механизм генерации отладочной информации в 'rustc';
- улучшены сообщения об ошибках для несбалансированных разделителей в 'rustc';
- удалена поддержка JIT в 'rustc';
- исполнимые файлы и статические библиотеки могут быть собраны с LTO (ключ '-Z lto');
- в 'rustc' добавлен флаг '--dep-info' для вывода сообщения зависимостей инструментам сборки.
Детальный обзор изменений с примерами
>>> Подробности