LINUX.ORG.RU

Rust 1.36

 


1

9

Команда разработчиков с радостью представляет вам Rust 1.36!

Что нового в Rust 1.36? Стабилизирован трейт Future, из нового: крейт alloc, MaybeUninit<T>, NLL для Rust 2015, новая реализация HashMap<K, V> и новый флаг --offline для Cargo.

А теперь подробнее:

  • В Rust 1.36 наконец-то стабилизировали трейт Future.
  • Крейт alloc.
    Начиная с Rust 1.36, части std, которые зависят от глобального аллокатора (например, Vec<T>), находятся в крейте alloc. Теперь std реэкспортирует эти части. Больше об этом.
  • MaybeUninit<T> вместо mem::uninitialized.
    В предыдущих релизах mem::uninitialized позволяла вам обходить проверку инициализации, использовалось это для ленивой аллокации массивов, но эта функция довольно-таки опасна (подробнее), поэтому был стабилизирован тип MaybeUninit<T>, который безопаснее.
    Ну и так как MaybeUninit<T> является более безопасной альтернативой, то, начиная с Rust 1.38, mem::uninitialized будет являться устаревшей функцией.
    Если хотите больше узнать про неинициализированную память, можете прочесть запись в блоге (Alexis Beingessner).
  • NLL для Rust 2015.
    В анонсе Rust 1.31.0 разработчики рассказывали нам о NLL (Non-Lexical Lifetime), улучшении для языка, которое делает borrow checker умнее и более дружелюбнее к пользователю. Пример:
    fn main() {
        let mut x = 5;
        let y = &x;
        let z = &mut x; // This was not allowed before 1.31.0.
    }
    
    В 1.31.0 NLL работал только в Rust 2018, с обещанием, что разработчики добавят поддержку и в Rust 2015.
    Если хотите больше узнать про NLL, можете прочитать больше в этой записи в блоге (Felix Klocks).
  • Новый флаг для Cargo - --ofline.
    В Rust 1.36 стабилизировали новый флаг для Cargo. Флаг --offline говорит Cargo использовать локально кешированные зависимости, для того, чтобы позже их можно было использовать без интернета. Когда нужные зависимости не доступны оффлайн, и если интернет все-таки нужен, то Cargo вернет ошибку. Для того, чтобы предварительно скачать зависимости, можно использовать команду cargo fetch, которая скачает все зависимости.
  • Здесь вы можете прочитать более детальный обзор изменений.

Также есть и изменения в стандартной библиотеке:

Другие изменения Rust, Cargo и Clippy.

>>> Подробности

★★★

Проверено: Shaman007 ()
Последнее исправление: Virtuos86 (всего исправлений: 4)
Ответ на: комментарий от MyTrooName

там пара описательных структур, да пара трейтов

Да, я выбрал не очень удачный пример. Что не отменяет того факта, что этого в core быть _вообще не должно_ и еще раз иллюстрирует концепцию развития «лебедь, рак и щука».

Barracuda72 ★★
()
Ответ на: комментарий от Barracuda72

Что не отменяет того факта, что этого в core быть вообще не должно

ну обоснуй, что ли, раз ты читал все rfc, на конкретике

MyTrooName ★★★★★
()
Ответ на: комментарий от Barracuda72

Этот пример как раз таки и показывает что ты нихрена не понял в том что прочитал. core::alloc - это ИНТЕРФЕЙС к аллокатору. Не алокатор, его можно отдельно притащить, можно самому запилить, можно вообще не делать, но тогда Box<T> у тебя не скомпилится.

Если хочется кучу - лепишь аллокатор, обмазываешь его #[global_allocator] чтобы рантайм который в этом случае появится знал куда идти за памятью, на этом оверхед практически кончается. А, сорян, за тобой память подметут если лайфтайм структуры кончился, беда-печаль. Ну или не подметут, если ты специально сказал «не трогай ёпрст!».

Dark_SavanT ★★★★★
()
Ответ на: комментарий от MyTrooName

Вопрос: зачем оно там? Ответ: незачем, оно должно быть в std - там, где «hosted» и стандартная библиотека. Все просто, если думать головой о дизайне языка и стандартной библиотеки.

Barracuda72 ★★
()
Ответ на: комментарий от Barracuda72

Ответ: незачем, оно должно быть в std - там, где «hosted» и стандартная библиотека.

Не, ты похоже не притворяешься.

Dark_SavanT ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.