LINUX.ORG.RU

Rust 1.22 (и Rust 1.22.1)

 


1

8

Почему сразу две версии? Чтобы задницы злопыхателей и критиков частых релизов полыхали ещё сильнее! (Как вариант, потому что 1.22.1 содержит патч, устраняющий баг в релизе 1.22, проявляющийся в Cargo у пользователей ОС macOS High Sierra, но это неточно.)

Что нового?

  • Основная фича: теперь вы можете использовать ? с Option<T>:
    fn try_option_some() -> Option<u8> {
        let val = Some(1)?;
        Some(val)
    }
    assert_eq!(try_option_some(), Some(1));
    
    fn try_option_none() -> Option<u8> {
        let val = None?;
        Some(val)
    }
    assert_eq!(try_option_none(), None);
    

    Пока функциональность ограничена; так, вы не можете писать код, который смешивает Result'ы и Option'ы в одной и той же функции, к примеру. Это станет возможным в прекрасном далёко.

  • Типы, реализующие Drop теперь доступны в `const` и `static` определениях:
    struct Foo {
        a: u32,
    }
    
    impl Drop for Foo {
        fn drop(&mut self) {}
    }
    
    const F: Foo = Foo { a: 0 };
    static S: Foo = Foo { a: 0 };
    

    Ничего особенного, но, согласитесь, приятно.

  • Два последних изменения в компиляторе должны ускорить компиляцию в режиме отладки.
  • T op= &T теперь работает для примитивных типов:
    let mut x = 2;
    let y = &8;
    
    // это не работало ранее, но теперь работает
    x += y;
    

    А раньше бы пришлось использовать разыменование: x += *y.

  • Улучшенные бэктрейсы на macOS.
  • Теперь вы можете создавать `compile-fail` тесты в Rustdoc:
    /// ```compile_fail
    /// let x = 5;
    /// x += 2; // shouldn't compile!
    /// ```
    
  • Наконец, мы удалили `le32-unknown-nacl` из поддерживаемых целей сборки. Google отказался от PNaCl в пользу WebAssembly. Вы уже можете компилировать Rust код в WebAssembly.

Подробно обо всём этом — в примечаниях к выпуску.

Стабилизация stdlib

Несколько новых API было стабилизировано в этом выпуске:

Cargo

★★★★★

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

8 не занимает память, а переменная занимает

Спасибо, поржал.

Как там живется в манямирке где внезапно переменные стали чем-то большим чем виртуальными сущностями, которые существуют только для компилятора языка?

Наверное, плохо, очень медленно и памяти вечно не хватает.

Сколько байт в памяти займет такая запись?)

let x = 0;
let y = x;
let z = y;
mersinvald ★★★★★
()
Последнее исправление: mersinvald (всего исправлений: 3)
Ответ на: комментарий от dzidzitop

указатель [...] указатель [...] указатель

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

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

кто придумал это let? это от let's party tonight?

«Пусть x = 42» на английском будет «Let x = 42». Всё логично.

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

Работать с литералом как с переменной нельзя не только в C и C++.

Про С уже написали, а на современном С++ литерал может быть практически любым значением с произвольным временем жизни:

#include <functional>
#include <iostream>
using namespace std; 

auto operator"" _add ( unsigned long long n ) {
    return [n](int a) { return n + a; };
}

int main() {
    cout << 10_add(20) << endl;
}
anonymous
()
Ответ на: комментарий от WatchCat

В расте годная система типов. Хотеть такое в мейнстриме. Обернута в какашку, к сожалению. Мне намекали на окамл, но такое я внедрить никак не смогу. А у раста вроде есть перспективы.

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

А у раста вроде есть перспективы.
bread

Кто-то взломал аккаунт хлебушка и постит еретические восхваления Rust?

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

Что характерно, после очень хорошего релиза C++11 и неплохого C++14 комитетчики плюсцов тоже тронулись умом на волне фичедрочерства.

Странное заявление. Плюсцы тронулись не на фоне раста - раст то вообще помойка, в которую пихают что не попадя. Раст - это такой жаваскрипт, только раст. Пихаем всё, что можно впихнуть, а далее разбираемся с тем - почему получилось дерьмо и почему всё надо менять. Кое как работает, ну и ладно.

Проблема плюсцов в том, что они сдвигаются от языка в сторону рантайма. Да, ущербанское api надо доделывать, ибо оно дерьмовое. Пример с тем же многострадальным pop().

Они забили, а вернее - занимаются не в приоритете, на сам язык. constexpr память? Зачем. Рефлексия? Зачем. Концепты? Зачем. Лучше мы будем mt-stl, ведь я же не могу взять любую либу для этого, но могу взять либу с концептами/рефлексией.

Хотя и языку перепадает - те же deduction guides пацаны ждали 10лет. Но зачем их делать - проще же накастылить make_pair() и прочей херни, а язык не трогать.

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

Взятие ссылки на 8

Нельзя взять ссылку от значение - ссылка есть только у объекта/переменной. Ошибка в логике номер раз.

Локальный вывод типов. Зачем в C++ auto?

Неверно. Ошибка в логике номер два. В С++ нужно декларировать тип и именно поэтому auto и заменяет декларацию типа. В твоей же поделки декларация типа не нужна, а значит и auto то же. Поэтому ссылка на авто, в твоём случае, - не имеет смысла.

В чем смысл обработки ошибок через исключения? Все ошибки любой природы смешать в кучу?

Ошибка в логике номер три. Как минимум в крестах есть два типа и твой и исключения, а у тебя один. Уже никак они не смешиваются.

Далее, для исключений есть перегрузка catch, а для Result?

А вообще нет, есть ошибки, которые можно обработать и нужно, для них Result. И я б не назвал кучей то, по чему можно проматчиться и предпринять действия по обработке в зависимости от типа ошибки.

Типа ошибки? Ты хотел сказать значения ошибки на который сам уже натянул тип?

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

Ну и? Падай.

В 70% юзкейсов - ошибок быть не должно, но они могут быть. И именно тут и работают исключения. Та же аллокация, да тысячи их. Это не паники в большинстве случаев.

А в остальных 30% - это в основном кейс «если то - то, иначе - это/либо ничего» - тут тоже никакие возвраты не нужны.

С исключениями бывают проблемы только при валидации данных, но и то какие проблемы - тормаза. Больше я ничего не могут придумать, но ты можешь сам попытаться.

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

А работает ли раст в связке с опенджиэль? Кто-нибудь уже пробовал игроделить? Можно ли посмотреть на что-нибудь опенсорсное в этом направлении?

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

А теперь для строковых литералов.

#include <iostream>
using namespace std; 

auto operator"" _add(const char* pref, size_t) {
    return [pref](string s) { return pref + s; };
}

int main() {
    cout << "10"_add("20") << endl;
}
anonymous
()
Ответ на: комментарий от anonymous

А работает ли раст в связке с опенджиэль? Кто-нибудь уже пробовал игроделить? Можно ли посмотреть на что-нибудь опенсорсное в этом направлении?

cast ozkriff

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

А работает ли раст в связке с опенджиэль?

А что там может не работать? Любой язык умеющий в биндинги к С умеет все, что умеют сишные библиотеки.

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

Работает, конечно, года с 2013ого.

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

Держи ссылок:

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

Нельзя взять ссылку от значение

Выше уже не единожды ответили, повторяться лень

С++ нужно декларировать тип и именно поэтому auto и заменяет декларацию типа

Внезапно в расте тоже, если тип не может быть выведен из контекста.

Как минимум в крестах есть два типа и твой и исключения, а у тебя один.

Говорят, что читать ветку помогает, чтобы не обсираться по фактам. Попробуй.

Ну и? Падай.

Ну дак на паниках и падаю, а ошибки — для того, что «может быть». Аллокация с паникой и падает при OOM.

если то - то, иначе - это/либо ничего

Именно эту задачу и решает AlgDT в возвращаемом значении.

mersinvald ★★★★★
()
Последнее исправление: mersinvald (всего исправлений: 1)

Отныне Cargo обеспечивает возможность использовать git репозитории как источники для разрешения зависимостей исходного кода.

«Источники разрешения заивисомтсей кода»? Там же речь о подключении «локальных» git репозиториев (vendoring) - для любителей надежности или проприетарщины. Типа, свои собственные аналоги crates.io.

ozkriff
()

Единственная годная весчь в этом всем - это карго. А где использовать сам раст ... да хрен его знает. пойду хеловорд очередной напишу с блекждеком и ссылками.

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

Вначале ответь на то, что ты проигнорировал.

А что ты хочешь услышать? Что можно натянуть сову на глобус сделать похожую семантику используя синтаксис с auto? Ну может и можно, не знаю. А на практике есть языки с let и var в которых работает вывод типов, а есть языки с auto где он не работает.

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

Я не вникал в детали (кому нужны подробности, пойдет читать примечания к выпуску в оригинале), но не вижу, чем моя довольно обтекаемая формулировка не соответствует твоей поправке.

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

Это была не поправка, это я, типа, переспросил. Я для хабры перевел этот кусок как «Теперь у Cargo есть возможность локальной подмены (vendoring) git репозиториев.». Ну да фиг с ним, чего-то я правда придираюсь :)

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

Вообще неплохо было бы разобраться. Я-то ОП довольно, кхм, вольно оформил по содержанию, но на технических ресурсах распространять дезинформацию неудобно.

В Новостях запостили новость аналогичную сабжевой. Там свой вариант перевода ^_^

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