包保护函数 - public(package)

在之前的课程中,我们已经介绍了Move的基本概念:模块、函数、对象和事件。在这门课程中, 我们将深入探讨Move和对象中更多有用的概念,以便构建一个更加有趣和复杂的Sui Fren世界。

首先让我们讨论函数。在之前的课程中,我们看到了公共函数和私有函数:

  • 公共函数可以被交易调用(通过我们稍后会介绍的可编程交易块),也可以被其他Move代码(同一模块或不同模块)调用。
  • 私有函数只能在同一模块内部调用。
module 0x123::my_module {
    public fun public_equal(x: u64): bool {
        x == 1000
    }
    
    fun private_equal(x: u64): bool {
        x == 1000
    }
}

如果你还记得,模块在Sui上部署时被分组为包。这导致了第三种函数可见性 - public(package)public(package)函数类似于其他语言中的包可见函数,只能被同一包中的模块调用。 这使开发人员能够限制危险函数仅被自己的模块调用,而不被其他模块调用。

module 0x123::my_other_module {
    use 0x123::my_module;

    public fun do_it(x: u64): bool {
        my_module::friend_only_equal(x)
    }
}

module 0x123::my_module {
    friend 0x123::my_other_module;

    public(package) fun friend_only_equal(x: u64): bool {
        x == 1000
    }
}

要创建一个public(package)函数,我们只需要使用相应的可见性修饰符 - public(package)。 在上面的例子中,调用public(package)函数的任何模块,例如 0x123::my_other_module。 使public(package)函数成为包可见函数。