Вышла новая версия Rust, языка программирования разрабатываемого Mozilla. Релиз несет в себе около 1500 изменений и исправлений ошибок.
Основные изменения:
- Язык:
- новый процесс RFC для изменения языка;
- паттерны с '@'-указателями удалены из языка;
- паттерны с '~[T]'-векторами удалены из языка;
- паттерны с '~str'-строками удалены из языка;
- '@str' удален;
- '@[T]' удален;
- '@self' удален;
- '@Trait' удален;
- заголовки, содержащие '@'-boxes для подсчета ссылок внутри типа, при '~'-аллокациях удалены;
- семантика времени жизни временных выражений (temporary expressions) изменена. Подробнее в #3511, #11585;
- добавлен новый cross-crate синтаксис расширений (доступен через feature gates). Подробнее в #11151. Эта возможность включает в себя макросы 'macro_rules!' и 'format!' как синтаксические расширения;
- добавлены новые режимы lint, использование старых по умолчанию выдает предупреждения:
- лишние скобки;
- static в верхнем регистре;
- Camel Case типы;
- переменные в верхнем регистре;
- приватные типы с публичной видимостью;
- '#[deriving]' с raw-указателями.
- unsafe-функции больше не преобразуются к замыканиям;
- некоторые макросы с неясными названиями, например 'log_syntax!', теперь доступны через feature gates;
- атрибут '#[simd]' теперь доступен через feature gates;
- запрещены инструкции 'extern crate' в настройках видимости, модификатор 'priv' запрещен к использованию вместе с 'use' инструкциями;
- замыкающие запятые запрещены в списках аргументов и шаблонах кортежей;
- ключевое слово 'do' теперь является резервированным ключевым словом;
- добавлены параметры типов по умолчанию, доступно через feature gates;
- изменен механизм захвата borrowed-переменных в замыкания;
- 'extern mod' изменен на 'extern crate';
- удален 'Freeze' trait;
- добавлен 'Share' trait для типов которые могут разделяться между потоками;
- labels в макросах теперь гигиенические;
- вызовы макросов теперь могут ограничиваться через '{}';
- добавлен возможность перегрузки операторов '*' и '.' через 'Deref' и 'DerefMut' traits;
- '~Trait' и 'proc' больше не реализуют 'Send' по умолчанию;
- добавлена поддержка partial type hints через маркер типа '_';
- введен тип 'Unsafe' для внутренней мутабельности. Преобразование '&T' в '&mut T' без использования 'Unsafe' является неопределенным;
- реализован атрибут '#[linkage]' для внешних функций;
- внутренний синтаксис атрибутов изменен с '#[foo];' на '#![foo]';
- 'Pod' переименован в 'Copy'.
- Библиотеки:
- 'libextra' более недоступна. Она была разделена на более мелкие компоненты. Подробности в документации;
- 'std::condition' удален. Все ошибки I/O передаются через тип 'Result'. Изменена работа макроса 'try!', подробности в #12039;
- std: модуль 'vec' переименован в 'slice';
- std: добавлен новый тип 'Vec<T>' для DST. В будущем это будет единственный вектор с изменяемым размером;
- std: увеличено число публичных reexports 'std::io'. Типы, такие как 'BufferedReader' доступны через 'std::io::BufferedReader' вместо 'std::io::buffered::BufferedReader';
- std: 'print' и 'println' более не доступны в prelude, используйте вместо них макрос 'println!';
- std: 'Rc' теперь имеет 'Weak' указатель для прерываемых циклов и больше не пытается статически предотвращать циклы;
- std: в стандартной поставке используется политика обработки ошибок пользователем вместо падения в библиотеках. Многие функции, такие как 'slice::last()' теперь возвращают 'Option<T>';
- std: 'fmt::Default' переименован в 'fmt::Show', добавлен новый deriving mode: '#[deriving(Show)]';
- std: 'ToStr' реализован для всех типов, реализующих 'Show';
- std: trait для форматированного вывода принимает '&self' вместо '&T';
- std: метод итераторов 'invert()' был переименован в 'rev()';
- std: добавлена возможности вывода backtrace при падении task'a, если выставлено значение переменной 'RUST_BACKTRACE';
- std: стандартизованы соглашения по наименованию для итераторов. Подробнее в wiki;
- std: 'eof()' удален из 'Reader';
- std: сетевые типы (networking types) теперь cloneable, разрешено одновременное чтение/запись;
- std: 'assert_approx_eq!' удален;
- std: добавлены спецификаторы форматирования 'e' и 'E' для вывода чисел с плавающей точкой в экспоненциальном формате;
- std: удален 'Times';
- std: добавлен тип 'std::kinds::marker' для выборочного вывода встроенных привязок (bounds);
- std: 'hash' был переписан, 'IterBytes' удален, доступен '#[deriving(Hash)]';
- std: 'SharedChan' был удален, 'Sender' теперь cloneable;
- std: 'Chan' и 'Port' были переименованы в 'Sender' и 'Receiver';
- std: 'Chan::new' заменен на 'channel()';
- std: реализован новый тип синхронных каналов;
- std: макрос 'select!' доступен для выбора 'Receiver'-ов;
- std: 'hashmap' и 'trie' были перемещены в 'libcollections';
- std: 'run' перемещен в 'io::process';
- std: 'assert_eq!' теперь использует '{}' вместо '{:?}';
- std: реорганизованы механизмы сравнения и проверки на равенство trait-ов;
- std: 'rand' перемещен в 'librand';
- std: 'to_{lower,upper}case' реализован для 'char';
- std: функциональность логгирования перенесена в 'liblog';
- collections: 'HashMap' переписана для увеличения производительности и уменьшения потребления памяти;
- native: в качестве рантайма по умолчанию используется 'libnative'. 'libgreen' доступен для загрузки вручную, подробнее в документации;
- native: реализована весь I/O функционал, за исключением сигналов;
- green: оптимизировано создание task-ов в 'libgreen';
- green: task-и, создаваемые через 'libgreen' используют unmapped guard page;
- sync: модуль 'extra::sunc' был обновлен на современный rust, перемещен в библиотеку 'sync';
- sync: добавлен новый тип 'Barrier';
- sync: реализованы эффективные мьютексы для нативных и зеленых task-ов;
- serialize: улучшен модуль 'base64';
- fourcc: добавлен макрос 'fourcc!';
- hexfloat: реализован макрос 'hexfloat!';
- Инструментарий
- 'rustpkg' объявлен устаревшим и удален из основного репозитория. Его замена ('cargo') в разработке;
- доступны ночные сборки;
- значительно улучшено использование памяти 'rustc';
- отключена поддержка rpath для rustc в процессе сборки;
- улучшен механизм кодогенерации;
- восстановлена совместимость debuginfo с lldb на OSX;
- флаги вывода централизованы в один флаг '--emit';
- флаги crate типов централизованы в один флаг '--crate-type';
- флаги кодогенерации объединены через флаг '-C';
- улучшены сообщения об ошибках возникающих при линковке с устаревшими crates;
- сообщения об ошибках с временем жизни теперь часто показывают как объявить функцию чтобы исправить ошибки;
- значительно расширена документация;
- улучшения в 'rustdoc':
- подсветка синтаксиса и блоки кода;
- генерация standalone markdown файлов;
- флаг '--test' проверяет все блоки кода по умолчанию;
- отображение экспортированных макросов;
- reexported типы имеют встроенную документацию в месте первого reexport;
- результаты работы по поиску в crate-ах теперь генерируется в выходную директорию.
>>> Подробности