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)

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

Servo — не особо пример хорошего кода в плане обработки ошибок.

Я даже больше скажу, мало какой большой проект - пример хорошего кода. Разве что ему много лет и его регулярно и целенаправленно рефакторят. Ну или авторы фанатики своего дела и продукта. И в этом плане servo хороший пример именно реального проекта, не идеального, не вылизанного в плане стиля. Код у среднестатистических кодеров будет еще хуже. И опять же я не предъявляю претензии к языку. Кто захочет - будет зализывать код, кто не захочет - получит панику в рантайме, а не порчу памяти. Адекватно и лично меня устраивает. Но при этом нужно понимать, что все имеет две стороны. Те же исключения при должном подходе и подходящей задаче позволяют здорово упрощать код, в то время как аналог на Rust будет перегружен и переусложнен.

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

snake_case Имена переменных и функций

Вот это самая жопень. Во многом поэтому видок у раста такой ублюдочный (особенно когда эта каша приправлена :: и <>). Какие-то сишные упорыши пропихнули это дерьмо. Но в сишке оно еще более-менее адекватно, а тут полный вырвиглаз.

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

Выглядит как чудовище франкенштейна из-за использования PascalCase и snake_case вперемешку. Хотя второй сам по себе УГ, масса места по горизонтали тратится на ненужные подчёркивания. Не могли сделать всёКакВJava.

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

Сомневаюсь, что аналог error-chain будет проще на исключениях.

Исключения в Java на порядок удобнее и проще чем костыль error-chain. И в данном случае ссылка на существование error-chain это скорее довод против системы обработки ошибок в Rust чем за.

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

Ну и как в Java получить список ошибок?

Если надо получить исключения, которые насобирались по цепочке, то getSuppressed, если речь шла о типах, то getSubTypesOf(Exception.class).

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

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

А без проверки обработки ошибок весь смысл как бы и теряется.

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

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

Убедиться, что все ошибки обработаны всё еще нельзя. Принтлн в мейне на всё — не обработка ошибок.

mersinvald ★★★★★
()

Почему сразу две версии?

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

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

Почему сразу две версии? Чтобы задницы злопыхателей и критиков частых релизов полыхали ещё сильнее!

Virtuos86 ★★★★★
() автор топика

Предлагаю инновационную систему версионирования. Выпускаем сразу два релиза: один штабильный (старый давно проверенный с багфиксами), другой поломанный к херам. И так каждый месяц. В итоге: версия растет (даже быстрее, чем сейчас), минетжеры довольны, но при этом есть стабильная ветка в четных релизах.

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

масса места по горизонтали тратится на ненужные подчёркивания

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

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

Я наберу camelCaseFunctionName быстрее, чем ты дождещься список автокомплита. А с подчеркиваниями не получится.

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

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

bread
()

поиграл я в этот ваш rust, убивают сразу, даже штаны не успеваешь скрафтить

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

Этот список сам составляется?

В try-with-resources - да, ну а так вручную. Хотя можно просто в конструктор передавать предыдущее и дергать

https://docs.oracle.com/javase/7/docs/api/java/lang/Throwable.html#getCause()

Так даже проще, да и в принципе и задумывалось так. Ну и в Rust, cудя по примерам, тоже надо писать ручной код.

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

While results indicate no difference in accuracy between the two styles, subjects recognize identifiers in the underscore style more quickly.

Всё верно, поэтому для макросов и кастовален snake_case используется, чтоб говно со ста метров распознавать.

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

Почему тогда во всех промышленных языках верблюд? Андерскоры только в C и наколенной скриптоте (которая и косила под C).

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

Хорошо, конечно, по памяти набирать длинные идентификаторы и стараться нигде не опечататься, чтобы не обламываться, когда код не скомпилируется из-за этого. Но проще и удобнее использовать автодополнение. За исключением тех случаев, когда пишешь хелловорлд с однобуквенными идентификаторами, как у меня в ОП.

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

Я делаю обычно так: fooBar<Tab>, и редактор в большинстве случаев дополняет без лишних вопросов. Опечатку дополнять не будет. Всп просто. А для локальных переменных и этого не надо, но у вас и там андерскоры понатыканы.

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

Андерскоры только в C и наколенной скриптоте (которая и косила под C).

В коде Xorg server например, в основном, паскаль и верблюд. Змея правда тоже встречается, в общем, зрелище не для слабонервных, как и сабж.

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

Правильно я понимаю, что Ada — это не промышленный язык, а нишевая маргинальщина, тогда как JavaScript — это именно что промышленный язык, а вовсе не нишевая маргинальщина?

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

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

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

А чем именно snake_case мешает автокомплиту?

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

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

Ну понятно, когда от софтверных систем зависит оборудование на сотни миллионов (а то и миллиарды) долларов и десятки/сотни тысяч жизней — это не промышленная разработка. А когда в стиле фигак-фигак и в продакшен миллионы вебмакак клепают сотни миллионов веб-магазинчиков, то это промышленная разработка и есть.

Ну, OK, чё...

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

В отличии от комитетчиков, разработчики Раста плотно работают с комьюнити и множество фич это vox populi.

Фейспалм. Комитетский дизайн, доведенный до абсурда. Раст принципиально впитывает все самое худшее?

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

Понятно. Но я C++ подразумевал. Сравнивать Rust с Java - бессмысленно.

Так в С++ тоже самое, только базовый класс надо свой. Зато можно убрать ручной код при броске/обработке:

#include <exception>
#include <iostream>
#include <vector>
using namespace std; 

struct my_exception : exception {
    exception_ptr caused_ { current_exception() };

    vector<my_exception*> chain() {
        vector<my_exception*> r { this };

        try {
            if(caused_)
                rethrow_exception(caused_);
        }
        catch(my_exception& ce) {
            const auto v = ce.get_chain();
            r.insert(r.end(), v.begin(), v.end());
        }
    
        return r;
    }
};


struct config_error : my_exception {
    const char* what() const noexcept override { return "Config"; }
};

struct io_error : my_exception {
    const char* what() const noexcept override { return "IO"; }
};

void read_config() {
    try {
        throw io_error();
    }
    catch(...) {
        throw config_error();
    }
}


int main() {
    try {
        read_config();
    }
    catch(my_exception& e) {
        for(const auto& ce : e.chain())
            cout << ce->what() << endl;
    }
}
anonymous
()
Ответ на: комментарий от eao197

Ну, OK, чё...

Ладно, давай переформулирую. Почему самые популярные языки для масс не жалуют андерскоры? Их создатели не учитывали читаемость (которую якобы улучшают подчеркивания)?

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

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

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

почему-то книг в camelCase я пока не видел.

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

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

Вот кстати часть официального примера error-chain:

/// Read the service config from the file specified.
fn load_config(rel_path: &str) -> Result<()> {
    File::open(rel_path)
        .map(|_| ())
        .chain_err(|| ErrorKind::ConfigLoad(rel_path.to_string()))
}

/// Launch the service.
fn launch(rel_path: &str) -> Result<()> {
    load_config(rel_path).map_err(|e| match e {
                                      e @ Error(ErrorKind::ConfigLoad(_), _) => {
                                          e.chain_err(|| LaunchStage::ConfigLoad)
                                      }
                                      e => e.chain_err(|| "Unknown failure"),
                                  })
}

Чтоб можно было визуально сравнить с исключениями.

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

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

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

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