Точка нулевого вызова таймера в Rust/Bevy?

#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. Спасибо. Это было действительно полезно!