Комментарии 21
Читается сложновато конечно. А автоматически к итератору кастить совсем никак в Rust? Только в лоб писать?
Имеется в виду упразднение iter()? Можно вместо этого амперсанд писать, но я привык так, т.к. кажется несколько более читабельным (вопрос привычки).
Т.е. вместо
for item in items.iter(){...} можно писать for item in &items {...}
Аналогично вместо iter_mut() - &mut
Я правильно понял вопрос?
Да, в C++ как-то проще выглядит for (Type i : Iterable)
Ключевой момент в том, чтобы амперсанд добавлять (или iter()). Иначе цикл будет потреблять элементы массива.
Это очень крутое отличие Rust от С++ и языков со сборщиком мусора, которое позволяет не париться с памятью - концепция владения. Рекомендую изучить, если не знакомы. Как освоил её и почувствовал её плюсы, просто влюбился в этот язык.
Это не совсем аналогично.
iter первичен, а вот итерация по &items вторична.
Конечно коллекции всё реализуют для удобства пользования.
«If a collection type C
provides iter()
, it usually also implements IntoIterator
for &C
, with an implementation that just calls iter()
. Likewise, a collection C
that provides iter_mut()
generally implements IntoIterator
for &mut C
by delegating to iter_mut()
. This enables a convenient shorthand:»
Тут просто возникает вопрос "а к какому из них кастить?". iter
/ iter_mut
/ into_iter
- соотвественно иммутабельная ссылка, мутабельная ссылка, поглощающий итератор - значения контейнера будут перемещены. А если тут какой-нибудь кастомный итератор по странной структуре, то как его кастить если ты забыл какой-нибудь IterMut
ему прописать?
for (mut commands) in commands_query.iter_mut() {
if check_in_progress(&commands) {
continue;
}
set_current_command(&mut commands_query);
}
Такие штуки просто замечательно писать через всякие filter
/ map
/ for_each
, чтобы количество вложенности уменьшать. Код выше превращается во что-то такое.
commands
.iter_mut()
.filter(|com| !check_in_progress(com))
.for_each(set_current_command);
Спасибо за рекомендацию. Выглядит куда более Rust-friendly, пока не привык к такому стилю. Но буду понемногу вводить его для себя.
Rust-friendly,
"Идиоматичнее", наверное хотели сказать. В общем на производительность такое никак не повлияет и можно жить и с циклами, но чтобы уменьшить цикломатическую сложность - то что доктор прописал. В некоторых ситуациях можно даже параллелизм прикрутить, но вам оно пока вроде не сильно нужно, т.к. bevy под капотом вроде что-то похожее проворачивает.
Задача на параллелизм уже лежит в бэклоге, возьмусь как только, так сразу)
Учитывая мою склонности ко вложенности из-за разных приятных решений вроде pattern matching и if let Some(), лишний раз подчистить код - не помешает.
Заметил характерную черту Rust-комьюнити. Ни разу не ловил в свой адрес какой-либо агрессии или негатива из-за того, что что-то не так делаю или чего-то не знаю. С другими языками обычно другая история была.
Возможно это совпадение и на деле мне просто повезло, но такая тенденция так или иначе радует.
Тут есть другая крайность - можно попасть под прицел Rust Evangelism Strikeforce и распевать с ними гимны про blazing fast, empowering и fearless concurrency.
Во, красота. Мне так и показалось, что иначе должно выглядеть. У меня на Python примерно также выходит, если код выглядит громоздко и неразборчиво, значит это на самом деле C++, С# или Java под маской питона. А когда pythonic way, то сразу красота.
Кстати, это интересная мысль про то, что это один язык под маской другого. Я так пытался в прошлом сделать пет-проект по геймдеву, но использовал андроидовскую Clean Architecture с MVVM, а не тот же ECS.
Очень двойственные чувства были: с одной стороны вроде привычно всё и понятно, а с другой как-то слишком громоздко, неудобно и неповоротливо.
Почему почти все "игры для программистов" считают, что программистам очуметь как нравится писать простые императивные команды?
Честно скажу, если бы мне на работе пришлось целыми днями писать все эти "start.server(); take_money_from_client(10); look_data();", я бы давно выкатился из айти. Единственные места где я использую такие команды это баш и гит, да и те заменяются скриптами и алиасами чтобы быть одной строчкой.
В рамках игры для программиста это могло было быть сделано так, что я объединяю все эти move, take, attack в какой-то скрипт и уже использую его. И то, это тоже была бы неинтересная игра.
Потому что работа большинства современных программистов очень далека от этого.
Но тем не менее все продолжают писать такие игрушки без особого успеха.
Главная фишка геймплея как раз в том, чтобы писать функции и процессы, которые будут автоматизировать эту рутину. Ну а интерес в этом деле - понятие субъективное, т.к. немало людей заинтересованы игрой, играют в демку в стиме и добавили в вишлист.
Далее про "игру для программистов": это, по сути, тег, который вешают на игры, которые требуют каких-либо навыков программирования (или развивают их). С таким же успехом можно докопаться про игры c тегом roguelike, в которых нет мошенников (rogue) и не рассказывается про то, почему они могут нравится (like).
И напоследок, про ЦА. Я провёл исследование (не отрицаю, что выборка не самая большая, но всё же), которое показало, что люди с опытом 5+ лет не заинтересованы в том, чтобы писать код после работы, чтобы играть в какую-то игру. Однако люди, которые хотят научиться программировать или только учатся, довольно тепло восприняли эту концепцию и с удовольствием играли.
Кстати могу порекомендовать игру Software Inc., там конечно не про работу программиста, а скорее руководства, но многие моменты довольно привычными и реалистичными показались.
«Once you go Rust, you never go back»: создаем игру для программистов на Bevy