Как Беви "оценивает" свои системы в зависимости от типа аргументов?
Bevy, новый игровой движок Rust и ECS, имеет функцию, в которой он "оценивает" свои системы в зависимости от типа аргументов. Из его документов:
Параметры, которые мы передаем "системной функции", определяют, на каких объектах работает система. В этом случае greet_people будет работать на всех объектах с компонентом Person и Name.
Выглядит это так:
struct Person;
struct Name(String);
fn greet_people(person: &Person, name: &Name) {
println!("hello {}", name.0);
}
Как Беви удалось добиться этого? Я думал, что где-то читал, что Rust не поддерживает отражение таким образом.
1 ответ
Беви определяет набор черт (IntoQuerySystem
а также IntoForEachSystem
), которые реализуются функциями, соответствующими этим сигнатурам. Эти черты затем экспортируются прелюдией Беви. Одним из ограничений этого является то, что вы можете преобразовывать функции только с определенным количеством аргументов в системы, и аргументы должны быть в определенном порядке ([команда?], [Ресурсы...], [запросы / компоненты...]).