Pull to refresh

Comments 36

Но вообще мне в этой истории непонятны нападки на async-std, что они создают фрагментацию и страдают NIH синдромом. В конце концов их видение очень сильно отличается от видения Tokio и так с ходу не очевидно, чье же видение в реальности лучше.
И кажется мне, что в таких делах все точки над i расставит время и реальные истории использования.
В конце концов это не первая и не последняя история с войной форков в опенсорсе и многие прошлые войны в результате привели к созданию очень годных продуктов.

Если честно, то я пока из реддита не понял точных причин происходящего, еще дочитываю. Было бы интересно.

Просто идентифицировал пострадавшего.

Кстати на реддите модераторы прикрывают этот флейм.
This thread has been locked by the moderators of r/rust
И блочат (похоже что и на гите o_O) всех комментирующих. Мило =)
Ну я так понимаю все началось из-за этого:

github.com/withoutboats/romio/pull/106

humbug с помощью ряда верных падаванов попытался пропиарить tokio как альтернативу async-std в некоем богом забытом проекте, некоторые участники этого проекта (в том числе его автор) несколько удивились явному форсингу рядового коммита по правке документации, и тут заверте…
Похоже на то, что их старую (3х летнюю) разработку токио бортанули в пользу нового переписанного на только введенных асинках асинк-рс, которой нет и 3х месяцев
Ну вроде не то чтобы бортанули, просто не упомянули как альтернативу (правда в конце концов таки упомянули вкратце, но остальные PR-related правки withoutboats вносить не стал).

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

Было бы интересно сравнить удобства async/await с использованием монад. Но в Rust отказались добавлять HKT, а следовательно и монады.

Не то чтобы отказались совсем, через GAT можно делать HKT как я понимаю. Но вот пока GAT не осилили

UFO just landed and posted this here
В данной ситуации мне не нравится, что на достаточно высоком уровне происходит конфликт, который (уже сейчас) выливается в стычки, задевающие непричастных людей. Не опускаясь до обсуждения «токсичности», «недружелюбности» и прочих упоминаемых терминов, мне кажется, что такое явление потенциально может негативно сказаться на сообществе в целом, вызвав раскол и снизив тем самым синергию.

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

Да даже если и было, если и прыскать ядом — то в направлении обидевшего, а не на всех вокруг.
А можно какое-нибудь summary драмы в нескольких предложениях?

Я забросил писать русскоязычные хабро-ежемесячники про раст, зато, если кому интересно, пару месяцев назад стал писать официальные ежемесячники чисто про ржавую разработку игр — https://rust-gamedev.github.io — только что вот октябрьский выпуск опубликован. :)

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

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

Какой-то странный асинк/авэйт. Вроде сделали, но сделали ленивым, асинхронная функция не начинает исполняться до авэйта. Получается, что невозможно запустить 2 асинхронные функции параллельно, код
let af = get_a_async();
let bf = get_b_async();
let a = af.await;
let b = bf.await;
не приведёт к поочерёдному исполнению частей get_a_async и get_b_async. Вообще разделение на 2 стадии, вызов функции и ожидание теряет смысл, можно было бы await заменить на вызов функции.

Сам async/.await тут ни при чём. Просто в Rust и без async/.await модель исполнения futures сделана poll-based, а не push-based как к этому все привыкли в других языка.
Это был осознанный выбор и этому есть ряд причин, которые неплохо описаны в этим статьях:



Что же касается "невозможностей", то таких нет. Всё возможно, просто выполняется немного иначе, нежели привыкли, и с оглядкой на poll-based ленивость футур. Конкретно ваш пример решается следующим образом:


let (a, b) = futures::join!(get_a_async(), get_b_async()).await;

А почему join макрос? Разве функцией он не реализуется?

В Rust нет variadic function arguments, потому существует несколько вариантов join'а в зависимости от кол-ва аргументов: join, join3, join4,… join_all.
Как вы догадываетесь, это обилие было бы не слишком приятно видеть в коде, потому эти функции сверху прикрыты макросом join!, который при разворачивании автоматически использует необходимую функцию.
Собственно, использование макроса для того, чтобы предоставить возможности variadic arguments — достаточно стандартный приём в Rust и применяется много где.

Спасибо, понятно. Я так понимаю, что variadic generics есть в долгосрочных планах и они заменят в будущем такого рода использование макросов?

Я ничего не слышал про планы на variadic generics. В плане языковых фич в данный момент есть планы на const generics, GATs (generic associated types) и specialization.


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


А в чём проблема использования макросов? ИМХО, одна из положительных сторон Rust — это как раз first-class citizen макросы. Они очень гибки и очень помогают для решения часто самых неожиданных задач, гораздо более чаще, нежели затыкают "дыры" выразительности языковых конструкций. После Rust их часто очень не хватает в других языках.

Я ничего не слышал про планы на variadic generics.
Я просто загуглил и нашел такой pre-RFC. Возможно, дальше этого дело не пошло, я не в курсе.
Но, даже если бы variadic generics были, я сомневаюсь, чтобы они помогли в данной ситуации, ведь они оперируют на уровне сигнатуры типов, а не сигнатуры аргументов функции.
Ну если variadic generics случатся, то написать функцию принимающую переменное число аргументов не должно быть проблемой (сужу по опыту C++).
А в чём проблема использования макросов?
Наверное, в использовании нет проблем (у меня нет практического опыта на Rust-е). Я думал про написание такого макроса — оперировать потоком токенов должно быть сложнее, чем написание generic функции.
Я думал про написание такого макроса — оперировать потоком токенов должно быть сложнее, чем написание generic функции.

С этим в целом глупо спорить. Но хорошая новость в том, что в этом Rust тоже достаточно не плох:


macro_rules! map {
    ($( $key:expr => $val:expr ),*) => {{
        let mut hm = HashMap::new();
        $( hm.insert($key, $val); )*
        hm
    }};
}

let number_names = map! {
    1 => "one",
    2 => "two"
};

Playground


Как видим, не ядерная физика в тривиальных случаях =)
В остальных будет больнее, да.

Да и эта * похожа на… в си плюс плюс, но когда надо целый класс определить с variadic, то как хорошо IDE умеет работать с кодом внутри макроса?

Им и живы =)
Но там тоже все ещё много работы в плане макросов. Декларативные раскрываются хорошо и дают нормальный автокомплит, но вот редактирование синтаксиса внутри декларативного макроса — только руками. У процедурных все не очень в плане раскрытия, но вот их написание вполне ОК, так как это обычный код работающий с токенами и AST.

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

А кириллические / не латинские имена переменных и функций разрешили использовать? В предыдущей версии Rust обещали разрешить "потом" :(

Sign up to leave a comment.

Articles