Выпуск 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 прочитано 14228 раз