Pull to refresh

Comments 19

UFO just landed and posted this here
Подход сам по себе не ужасный, но он ухудшает читаемость кода. Однако компилятор вроде как отлавливает все эти скользкие моменты.
UFO just landed and posted this here
UFO just landed and posted this here
UFO just landed and posted this here
return еще хуже. При перемещении строчки с return, меняется смысл других строчек — некоторые перестают выполняться.
UFO just landed and posted this here
Добавление разделителя ";" — это появление нового пустого выражения, не более того.
"," в некоторых языках разделитель аргументов функции. Если допускаются опциональные аргументы, то добавление/удаление "," может менять смысл.
Тоже так кажется. Да и вообще, снова эти точки с запятой, почему я должен думать об этой фигне, а не компилятор?
А loop с метками это какой-то жуткий goto
UFO just landed and posted this here
Ну loop это по сути то же самое что while true в других языках — просто сокращение (которое ещё может учитываться компилятором для оптимизации). Кроме того, из-за паттерн-матчинга очень часто я замечаю за собой применение паттерна типа

loop {
    match do_something {
        p1 if a => { ... }
        p2 if b => { ... }
        something_else => { ...; break }
    }
}

или что-то подобное. Актуально для парсеров.
Лично я не вижу никакой ужасности этого подхода. Вариант с оператором return немного проще замечается, зато вариант со специальным синтаксисом для финального выражения короче и более адекватно смотрится с короткими анонимными функциями, которые в Rust довольно часто используются. Я бы не сказал, что читаемость в целом страдает.

Я так понимаю, этот вариант достался ржавчине от функциональных языков (ocaml, например).

На практике, пока я экспериментировал с ржавчиной ( github.com/ozkriff/marauder ), никаких сложностей с этим у меня не возникало: если у функции в сигнатуре есть "->" то сразу понятно, что последняя строчка чего-то возвращает, а анонимные функции обычно очень короткие (иначе стоит вынести из них логику) и в них вообще все сразу понятно.

По этому поводу интересная статейка давно еще была: lucumr.pocoo.org/2012/10/18/such-a-little-thing
Да не, достаточно удобно. Главное, что если вы функцию опишете как возвращающую что-то, но влепите лишнюю ';', то оно не скомпилируется.

fn add(a: uint, b: uint) -> uint {
    a + b;
}

<anon>:5:1: 7:2 error: not all control paths return a value
<anon>:5 fn add(a: uint, b: uint) -> uint {
<anon>:6     a + b;
<anon>:7 }
<anon>:6:10: 6:11 note: consider removing this semicolon:
<anon>:6     a + b;
                  ^
error: aborting due to previous error


is.gd/9tD5AB — пример.
Они опять изобрели Perl. Только пока что сильно испорченный.
С таким синтаксисом популярность Rust не грозит. Будущее за D.
У Rust современный синтаксис. Если что-то привычное, не значит, что оно правильное.
Вот читаю уже вторую статья… Может вы лучше сразу перейдете к хардкоку, и напишите про управление памяти в Rust? А как циклы работают, ну это и так все очень просто…
Sign up to leave a comment.

Articles