有哪些不同的可见性说明符?
现在您已经了解了函数的基础知识,让我们进一步深入探讨 move 中函数的不同方面。
功能可见性
可见性意味着如何从定义函数的模块中访问函数。例如,任何其他模块是否可以访问该函数。因此,在某些情况下,开发人员可能需要其特定模块之外的功能,而在某些情况下则不需要。因此,为了处理这个问题,我们有两个最流行的可见性说明符:Private 和 Public。
私有函数
默认情况下,函数可见性设置为私有,这意味着该函数只能由同一模块访问,但不能在模块外部访问。让我们看下面的例子。
module examples::math {
use sui::object::UID;
use sui::tx_context::{Self, TxContext};
// std::string import
use std::string::{Self, String};
// Declaring the Name
public struct Numbers has key {
id: UID,
a: u8,
b: u8,
}
// Initializing the constructor
fun init(a: u8, b: u8, ctx: &mut TxContext) {
let numbers = Numbers {
id: object::new(ctx),
name: string::utf8(name_bytes)
}
}
fun add(n: Numbers) {
let sum = n.a + n.b;
}
}
这里,默认情况下, add
是私有函数。
公有函数
您可以将 public
关键字与 move 函数一起使用以将其公开。公共函数可以在模块外部访问,这意味着其他模块(也称为它们的函数)也可以访问公共函数。让我们在最后一个示例中添加一个公共函数。
module examples::math {
use sui::object::UID;
use sui::tx_context::{Self, TxContext};
// std::string import
use std::string::{Self, String};
// Declaring the Name
public struct Numbers has key {
id: UID,
a: u8,
b: u8,
}
// Initializing the constructor
fun new(num_1: u8, num_2: u8, ctx: &mut TxContext) {
let numbers = Numbers {
id: object::new(ctx),
a: num_1,
b: num_2,
}
}
fun add(n: Numbers) {
let sum = n.a + n.b;
}
public fun sub(n: Numbers){
let result = n.a - n.b;
}
}
现在,通过将 public
关键字放在 fun
关键字之前,我们使 sub
函数成为可以在模块外部访问的公共函数。
输入函数
在move中,基本操作之一是代表各个用户的地址之间的gas对象传输。当您进行交易时, entry
函数是直接调用的。要初始化 entry
函数,我们需要确保以下三件事。
- 该函数应由
entry
关键字标记。 - 它不应该有返回值。
- 入口函数的最后一个参数必须是对该类型实例的
TxContext
可变引用。
让我们以我们在课程开始时讨论的“Hello World”程序为例。
#![allow(unused)] fn main() { public entry fun mint(ctx: &mut TxContext) { let object = HelloWorldObject { id: object::new(ctx), text: string::utf8(b"Hello World!") }; transfer::public_transfer(object, tx_context::sender(ctx)); } }
现在,该函数将在交易时执行,并且 &mut TxContext
是一个可变引用,有助于识别想要铸造合约的发送者的地址。函数末尾的 transfer
模块不会返回任何值,但有助于将对象存储在 Sui 全局存储中,您可以在部署模块后全局访问该对象。别担心,我们将在课程结束时详细讨论“Hello World”程序。
小结
功能可见性和入口功能在move中起着至关重要的作用。通过了解它们,您已经很厉害了。现在,我们需要更深入地研究 move 对象。让我们深入探讨一下。