Rust/Bevy中的Dot Zero调用定时器?

7

在 Bevy 书中使用了以下代码:

struct GreetTimer(Timer);

fn greet_people(
    time: Res<Time>, mut timer: ResMut<GreetTimer>, query: Query<&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.0name.0调用有什么作用? 书中没有解释,我发现Timer有一个tick方法,那么既然timer已经是Timer了,.0在这里有什么作用呢?

2
但是你正在使用 GreetTimer,而不是 Timer。并且 GreetTimer 是一个tuple struct,所以你必须访问它的第一个(也是唯一的)元素,因为 GreetTimer 本身没有定义 tick() 方法。 - justinas
1个回答

6

这与元组有关。在 Rust 中,可以通过项目在元组中的位置来访问元组:

let foo: (u32, u32) = (0, 1);
println!("{}", foo.0);
println!("{}", foo.1);

有些元组结构也会发生这种情况:

struct Foo(u32);

let foo = Foo(1);
println!("{}", foo.0);

游乐场

您还可以查看一些文档


那么 ResMut<GreetTimer> 是一个 GreetTimer 的一元组,或者说 ResMut 结构体可以像元组一样进行操作? - BWStearns
1
@BWStearns,GreetTimer是一个包装类型,它的唯一内部元素可以通过.0访问。 - Netwave
2
ResMut 实现 Deref / DerefMut,这就是为什么你可以像操作 T 一样神奇地操作 ResMut<T>参见书籍)。.0GreetTimer 是一个元组结构体的产物,与编译器自动解引用 ResMut 是一个独立的问题。 - justinas
谢谢。这真的很有帮助! - BWStearns

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接