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.

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

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

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

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

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

Окей, берём no_std с core по минимуму, озвучь из-за каких именно абстракций тебе не видно железа?

Разместить переменную в .data ты можешь так же как и в сях, разместить структуру на стеке - то же самое. Разместить на куче - точно так же тебе нужна реализация аллокатора. Только если на си это реализация malloc и free, то на расте это более сложный трейт, который в итоге сводится к тем же самым malloc, free, realloc.

Писать в память? пжалста. Интринсики? Тут тебе и сишечка не помощник. Асмовую вставку написать? ну чуть сложнее и до сих пор за feature gate, щито поделать, но можно написать на асме, собрать в build.rs и подлинковать в процессе.

Структуры? Да, если хочется пакованых структур надо будет написать директиву. vtable? ну сорян, можно обойтись и без, но это будет код на си в синтаксисе раста.

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

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

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

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

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

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

Ладно, я сливаюсь - устал спорить с фанатиками. Мне надоело что-то доказывать, да и смысл.

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

Сливаться он собрался. Нет уж, сказал «А», говори и «Б». Мой интерес к расту как раз и лежит в области контроллеров и no_std и я сам могу много матерного рассказать про то что и как, но ты порешь какую-то дичь и на простейшие вопросы ныкаешься. Если уже озвучивал предметно - ссылку в студию. Пока я видел какое-то нытьё неосилятора прочитавшего пол-странички доков.

На расте действительно не очень удобно писать низкоуровневую работу с железом, но это не из-за того что он что-то там скрывает, а потому что он очень рьяно кидает тебе батарею на руки для выпрямления.

Dark_SavanT ★★★★★ ()
Последнее исправление: Dark_SavanT (всего исправлений: 1)
Ответ на: комментарий от Barracuda72

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

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

Dark_SavanT ★★★★★ ()
Закрыто добавление комментариев для недавно зарегистрированных пользователей (со score < 50)