在本课程中,我们将学习如何通过更新结构体的字段来修改现有对象。 首先我们需要讨论可变引用。在之前关于读取对象字段的课程中, 我们介绍了不可变引用以及在发送交易以读取对象状态时如何将其传递给公共函数。

为了修改对象,我们需要使用可变引用。语法上的区别非常简单 - 使用&mut StructName代替&StructName。 当与Sui区块链进行交互时,用户可以从函数的参数中清楚地看出,函数是只读还是读写对象,方法是检查它是否需要不可变对象(只读)或可变对象(读写)。

要编写一个更新对象的函数,我们首先需要通过可变引用指定要修改的对象,然后更新它的字段。所有修改后的对象在交易结束时会自动保存到区块链上。示例:

module modules::my_module_10 {
   use std::vector;
   use sui::object::{Self, UID};
   use sui::transfer;
   use sui::tx_context::TxContext;


   public struct MyObject has key {
       id: UID,
       value: u64,
   }


   fun init(ctx: &mut TxContext) {
       let my_object = MyObject {
           id: object::new(ctx),
           value: 10,
       };
       transfer::share_object(my_object);
   }


   public fun set_value(my_object: &mut MyObject, value: u64) {
       my_object.value = value;
   }
}

就是这样!非常简单,对吧?你只需传递一个可变引用给对象,而不是不可变引用。