Выпуск Rust 1.53. Google профинансирует добавление поддержки Rust в ядро Linux
Опубликован релиз языка системного программирования Rust 1.53, основанного проектом Mozilla, но ныне развиваемого под покровительством независимой некоммерческой организации Rust Foundation. Язык сфокусирован на безопасной работе с памятью, обеспечивает автоматическое управление памятью и предоставляет средства для достижения высокого параллелизма выполнения заданий, при этом обходясь без использования сборщика мусора и runtime (runtime сводится к базовой инициализации и сопровождению стандартной библиотеки).
Автоматическое управление памятью в Rust избавляет разработчика от ошибок при манипулировании указателями и защищает от проблем, возникающих из-за низкоуровневой работы с памятью, таких как обращение к области памяти после её освобождения, разыменование нулевых указателей, выход за границы буфера и т.п. Для распространения библиотек, обеспечения сборки и управления зависимостями проектом развивается пакетный менеджер Cargo. Для размещения библиотек поддерживается репозиторий crates.io.
Основные новшества:
- Для массивов реализован типаж IntoIterator, позволяющий организовать перебор элементов массива по значениям:
for i in [1, 2, 3] { .. }
Также появилась возможность передачи массивов в методы, принимающие итераторы, например:
let set = BTreeSet::from_iter([1, 2, 3]); for (a, b) in some_iterator.chain([1]).zip([1, 2, 3]) { .. }
Ранее IntoIterator был реализован только для ссылок на массивы, т.е. для перебора по значениям требовалось использование ссылок (»&[1, 2, 3]») или »[1, 2, 3].iter ()». Реализации IntoIterator для массивов мешали проблемы с совместимостью, вызванные ранее добавленным в компилятор преобразованием метода array.into_iter () в (&array).into_iter (). Указанные проблемы удалось решить обходным путём — компилятор продолжит преобразование array.into_iter () в (&array).into_iter (), как если бы отсутствовала реализация типажа IntoIterator, но только при вызове метода с использованием синтаксиса ».into_iter ()» и не касаясь вызовов в форме «in [1, 2, 3]», «iter.zip ([1, 2, 3])», «IntoIterator: into_iter ([1, 2, 3])».
- Предоставлена возможность указания выражений »|» (логическая операция OR) в любой части шаблона, например, вместо «Some (1) | Some (2)» теперь можно писать «Some (1×2)»:
match result { Ok(Some(1 | 2)) => { .. } Err(MyError { kind: FileNotFound | PermissionDenied, .. }) => { .. } _ => { .. } }
- Разрешено использование не-ASCII символов в идентификаторах, в том числе любых национальных символов, определённых в спецификации Unicode UAX 31, но кроме символов emoji. При использовании разных, но похожих по начертанию символов, компилятор выведет предупреждение.
const BLÅHAJ: &str = "
© OpenNet