之前,我们编写了一个简单的票务应用程序,该应用程序创建具有到期时间的票。现在让我们引入一个单独的函数来读取这个expiration_time字段并检查票是否已过期:

module modules::ticket_module_05 {
    use sui::clock::{Self, Clock};
    use sui::object::{Self, UID};
    use sui::transfer;
    use sui::tx_context::TxContext;

    public struct Ticket has key {
        id: UID,
        expiration_time: u64,
    }

  public fun is_expired(ticket: &Ticket, clock: &Clock): bool {
     ticket.expiration_time >= clock::timestamp_ms(clock)
  }
}

要读取Ticket对象(object)的数据,上述的is_expired函数接收一个对Ticket对象的不可变引用。 Move区分引用和对象值。当我们只需要在 is_expired 中读取现有票的状态时, 我们便使用引用,而不应该重新创建或复制整个票。这类似于电子票, 你可以在手机和笔记本电脑上有多个副本,但它们都指向同一张票。不可变引用只是意味着你不能更新相关结构体(struct)的字段, 其以为&StructName类型来表示。请注意,is_expired还接收一个Clock对象引用(&Clock)。这是另一个自动参数,类似于系统传递的TxContext。 我们稍后会详细介绍这一点。