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)

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

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

Синтаксис вполне хорош, только не рассчитан на однострочные лямбды без захвата переменных. И тут, учитывая наличие generic lambdas в С++14, надо просто добавить сахар для их написания.

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

[](auto d){ return d <= 0; }

Я так понимаю, что к уродству приводит только наличие []() и надобность в написании return?

И еще auto. И еще {}.

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

И еще auto.

И как бы ты разбирался с ситуациями когда аргументом должен быть value, reference или const reference?

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

Как этот фрагмент ты бы переписал в не уродливом синтаксисе?

let a = [0, 1, 2, 3];
    
if a.iter().any(|&x| x <= 0) {
    return Err(InvalidArgument("Geometry with bin width less or equal to zero"))
}

¯\_(ツ)_/¯

P.S синтаксис — вкусовщина, для людей, пишущих на языке, он удобен, любые взгляды со стороны — хрень.

mersinvald ★★★★★
()
Последнее исправление: mersinvald (всего исправлений: 3)
Ответ на: комментарий от eao197

И как бы ты разбирался с ситуациями когда аргументом должен быть value, reference или const reference?

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

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

Нахера тут лайфтайм на ровном месте? Еще и не объявленный. Не рапространяй 4.2

Эээээ. Я что-то хотел изобразить.

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

ошибки не описываются каким-то одним на всех типом, внезапно

Описываются. Не описываются только в языках без AlgDT.

Вероятно, имеются в виду открытые множества ошибок. Они и с AlgDT не описываются единым типом.

tailgunner ★★★★★
()

Никак в толк не возьму, эта хрень PascalCase, camelCase или snake_case или всё сразу? Выглядит конечно бесподобно, ну это кажись уже без меня написали.

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

Да, согласен, iter лишний, хз есть ли по этому поводу обсуждения.

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

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

Если camelCase в одно слово, то мне не отличить от snake_case.

То есть ты его всё же не видел. Я так и думал.

O_o а что-то одно было взять не судьба?

Что-то одно не взяли вообще нигде.

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

Вероятно, имеются в виду открытые множества ошибок. Они и с AlgDT не описываются единым типом.

Ну вообще говоря, описываются. Пусть не единым, но вложенным, см error_chain и его аналоги.

Там пилится некий ErrorKind, включающий в себя возможные ошибки, которые могли возникнуть, как юзерские, так и возникающие в либах.

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

Джава — это сириуз бизнес, там всё продумано.

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

Вероятно, имеются в виду открытые множества ошибок. Они и с AlgDT не описываются единым типом.

Ну вообще говоря, описываются.

Нет.

Там пилится некий ErrorKind, включающий в себя возможные ошибки, которые могли возникнуть, как юзерские, так и возникающие в либах.

Оно основано на трейте std::error::Error

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

Что-то одно не взяли вообще нигде.

А как же стандартный C++? Терпеть не могу snake_case, но он там консистентен.

d_a ★★★★★
()

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

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

А как же стандартный C++?

Стандартный Си++ - это стандартная библиотека Си++? Так это одна библиотека. В Си++ как раз зоопарк, хотя библиотеки могут выдерживать свои стили.

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

Стандартный Си++ - это стандартная библиотека Си++?

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

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

Кстати, в GNU libstdc++ имена членов пишутся _M_имя_члена, имена классов-хелперов - My_helper_class.

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

В Rust, насколько я могу судить, соглашение соблюдается и в пользовательском коде. Потому что оно относительно разумно (не Python, но тоже неплохо).

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

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

В расте conding conventions форсятся на уровне предупреждений компилятора, да и вообще общеприняты в сообществе. Ни в одну либу не примут PR с нарушением конвенций, да и я лично нарушения встречал только в закрытом коде, не систематические, в основном от невнимательности

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

В Си++ как раз зоопарк, хотя библиотеки могут выдерживать свои стили.

В Rust, насколько я могу судить, соглашение соблюдается и в пользовательском коде. Потому что оно относительно разумно (не Python, но тоже неплохо).

Какой бы ни был хороший стиль в std, я например для пользовательского кода предпочту любой другой (но выдержанный сам с собой), просто чтобы за версту было видно, где заканчивается std и начинается зона наколенных поделок. Возможно, остальные экземпляры в зоопарке C++ считают также.

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

где заканчивается std и начинается зона наколенных поделок

Видно по пути модуля.

У нас тут не сишка с одним глобальным неймспейсом на всё

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

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

исключение может быть любого типа.

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

литерал не имеет адреса, а если имеет, то это что-то в голове не так у того, кто хочет получить адрес или ссылку на 8.

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

Кстати, в GNU libstdc++ имена членов пишутся _M_имя_члена, имена классов-хелперов - My_helper_class.

Это, безусловно, очень здорово, что мне не надо использовать имена членов и классы-хелперы из libstdc++.

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

Насколько я понимаю, это просто сахар для следующего:

let v = 8;
let y = &v;

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

Тебе выше уже привели эквивалентный код с переменными. В примере... внезапно — пример.

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

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

Не обработанный вариант ошибки == ошибка компиляции.

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

в

Result<T, E>
T и E - типы-параметры.

исключение может быть любого типа.

Вот это как раз и есть

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

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

Не обработанный вариант ошибки == ошибка компиляции.

В теории звучит хорошо, а на практике тот же servo переполнен unwrap, итого и программа может вылететь в любой момент (а паники в servo вылетают регулярно), и код перегружен.

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

Ну как бы это раньше скорее было абстранирование

имхо таки наоборот. может, конечно, вопрос терминологии, а может, я не с того конца подхожу к проблеме.

добавили вариант синтаксиса

There should be one-- and preferably only one --obvious way to do it, опять же

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

литерал не имеет адреса

Это закон физики?

а если имеет, то это что-то в голове не так у того, кто хочет получить адрес или ссылку на 8.

Если в голову не умещается идея адреса read-only константы, с головой что-то не так.

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

Вероятно, имеются в виду открытые множества ошибок. Они и с AlgDT не описываются единым типом.

Ну вообще говоря, описываются.

Нет.

Хорошая аргументация

Это не аргументация. То, что в AlgTD конечный список вариантов - просто факт.

Оно основано на трейте std::error::Error

Что, правда что-ли?

Ага. Сам почитай.

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

Кстати, в GNU libstdc++ имена членов пишутся _M_имя_члена, имена классов-хелперов - My_helper_class.

Это, безусловно, очень здорово, что мне [...]

Речь не о тебе, а о библиотеке.

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

тот же servo переполнен unwrap

servo пока на стадии прототипа

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

Servo — не особо пример хорошего кода в плане обработки ошибок. Многое писалось на 1.0 и альфа-версиях, многих фишек тогда еще не было, итд.

Проект разрабатывают быстрее, чем успевают латать, то что показывает себя в альфе на серво хорошо — портируют в ФФ, там уже причесывают.

Это R&D, там главное PoC и проверка гипотезы, а не готовый продакшн-продукт.

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

Лол. Дебильней заявления ещё поискать.
Инструмент делают для людей, а не наоборот.
Да и не охлократия там.
Собор, а не базар, всё-таки.

WatchCat ★★★★★
()
Последнее исправление: WatchCat (всего исправлений: 2)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.