Skip to content

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() 尝试调用它,编译器会抛出错误。

公共可见性

通过在 funstruct 关键字前加上 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 提供了三种主要的可见性修饰符,用于灵活地控制模块成员的访问范围:

  1. 内部可见性(默认)
    • 模块成员是私有的,仅能在定义它们的模块内部访问。
  2. 公共可见性
    • 使用 public 修饰符,将模块成员开放给所有模块。
  3. 包可见性
    • 使用 public(package) 修饰符,将模块成员限制为仅能在同一包内访问。

通过合理选择可见性修饰符,开发者可以更好地组织代码,保护模块内部实现细节,并提高代码的安全性和可维护性。