LINUX.ORG.RU

Rust 1.22 (и Rust 1.22.1)

 


1

8

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

Что нового?

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

Стабилизация 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
()
Ответ на: комментарий от bread

В Расте нет сишного препроцессора, в отличии от.
Так что нет. И поменьше фейспалмов, а не то разбьёшь себе лицо.

WatchCat ★★★★★
()
Последнее исправление: WatchCat (всего исправлений: 1)
Ответ на: комментарий от 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
()
Ответ на: комментарий от anonymous

.map(|_| ())
Result<()>

Зачотные смайлики!

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

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

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

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