13. 可见性修饰符
在 Move 中,可见性修饰符用于控制模块成员(如结构体和函数)的访问范围。默认情况下,模块成员是私有的,只能在定义它们的模块内访问。
通过灵活地使用可见性修饰符,可以实现代码的封装性和模块化,增强代码的安全性和可维护性。
内部可见性
默认情况下,模块中的函数和结构体只能在定义它们的模块内部访问。尝试从其他模块调用这些私有成员会导致编译错误。
示例
以下代码展示了内部可见性的工作方式:
move
module book::internal_visibility;
// 只能在本模块内调用
fun internal() {
/* ... */
}
// 同一个模块内可以调用 internal()
fun call_internal() {
internal();
}
module book::try_calling_internal;
use book::internal_visibility;
// 不同模块尝试调用 internal() -> 编译错误
fun try_calling_internal() {
internal_visibility::internal();
}
在此示例中:
internal()
是默认私有的,仅能从internal_visibility
模块内调用。- 如果
try_calling_internal()
尝试调用它,编译器会抛出错误。
公共可见性
通过在 fun
或 struct
关键字前加上 public
修饰符,可以将函数或结构体设为公共的。公共成员可以从其他模块导入并调用。
示例
以下代码展示了公共可见性的工作方式:
move
module book::public_visibility;
// 公共函数,可以从其他模块调用
public fun public() {
/* ... */
}
module book::try_calling_public;
use book::public_visibility;
// 不同模块调用 public() -> 正常工作
fun try_calling_public() {
public_visibility::public();
}
在此示例中:
public()
被声明为公共的,允许其他模块通过use
导入后调用。try_calling_public()
调用了public()
,且运行正常。
包可见性
Move 2024 引入了包可见性修饰符,为函数和结构体提供了一种中间访问控制级别。具有包可见性的模块成员可以在同一包内的任何模块中访问,但不能从其他包访问。
示例
以下代码展示了包可见性的工作方式:
move
module book::package_visibility;
// 包可见性函数,仅限同包模块访问
public(package) fun package_only() {
/* ... */
}
module book::another_module_in_same_package;
use book::package_visibility;
// 同包内模块调用 package_only() -> 正常工作
fun test_package_only() {
package_visibility::package_only();
}
module other_package::external_module;
use book::package_visibility;
// 不同包尝试调用 package_only() -> 编译错误
fun try_call_package_only() {
package_visibility::package_only();
}
在此示例中:
package_only()
使用了public(package)
修饰符,允许同包模块调用。- 来自不同包的模块如
external_module
无法调用package_only()
。
总结
Move 提供了三种主要的可见性修饰符,用于灵活地控制模块成员的访问范围:
- 内部可见性(默认)
- 模块成员是私有的,仅能在定义它们的模块内部访问。
- 公共可见性
- 使用
public
修饰符,将模块成员开放给所有模块。
- 使用
- 包可见性
- 使用
public(package)
修饰符,将模块成员限制为仅能在同一包内访问。
- 使用
通过合理选择可见性修饰符,开发者可以更好地组织代码,保护模块内部实现细节,并提高代码的安全性和可维护性。