#rust #bevy
Вопрос:
В книге Bevy используется следующий код:
struct GreetTimer(Timer);
fn greet_people(
time: Res<Time>, mut timer: ResMut<GreetTimer>, query: Query<amp;Name, With<Person>>) {
// update our timer with the time elapsed since the last update
// if that caused the timer to finish, we say hello to everyone
if timer.0.tick(time.delta()).just_finished() {
for name in query.iter() {
println!("hello {}!", name.0);
}
}
}
Что timer.0
name.0
делают звонки и? В книге это не рассматривается, и я вижу, что в этом Timer
есть метод галочки, так что .0
же здесь происходит, так timer
как это уже а Timer
?
Комментарии:
1. Но ты используешь
GreetTimer
, а неTimer
. И GreetTimer-это структура кортежа , поэтому вам нужно получить доступ к ее первому (и единственному) элементу, так какGreetTimer
он сам по себе не определяетtick()
метод.
Ответ №1:
Это связано с кортежами. В rust кортежи могут быть доступны по позиции элемента таким образом:
let foo: (u32, u32) = (0, 1);
println!("{}", foo.0);
println!("{}", foo.1);
Это также происходит с некоторыми (кортежными) структурами:
struct Foo(u32);
let foo = Foo(1);
println!("{}", foo.0);
Вы можете дополнительно проверить некоторые документы.
Комментарии:
1. Итак
ResMut<GreetTimer>
GreetTimer
, можно ли оперировать 1-кортежем или структурой ResMut, как если бы это был кортеж?2. @BWStearns, GreetTimer-это тип оболочки, доступ к которому осуществляется только к его внутреннему элементу с помощью этого
.0
3.
ResMut
реализуетDeref
/DerefMut
, вот почему вы можете волшебным образом действоватьResMut<T>
, как если бы это былоT
(см. Книгу)..0
является артефактом структурыGreetTimer
кортежа и представляет собой отдельную проблему, не связанную сResMut
автоматическим разыменованием компилятором.4. Спасибо. Это было действительно полезно!