Skip to Content

模块(Module)

module 是文件级的组织单元与可见性边界。每个文件至多一条模块声明,必须在文件首,不声明的文件落入默认模块 Main(隐式 partial)。

文件头声明

module App; func Describe() -> string => "单文件模块"; func main() -> int { print(App.Describe(), Describe()); return 0; }
单文件模块 单文件模块

本模块内的成员,限定名(App.Describe())与裸名都可用。模块名是单段 Unicode 标识符,不允许带点以及数字开头。

同包模块免前缀

同一包内的模块,互相用模块名前缀直接访问成员,不需要任何 import:

// lib.ms module Lib; public func Hello() -> string => "来自 Lib"; public val Answer: int = 42;
// main.ms module Main; func main() -> int { print(Lib.Hello(), Lib.Answer); return 0; }
来自 Lib 42

想要使用裸名需写 import,不导入时前缀永远可用。

默认封闭与 partial

一个模块的源码默认只能位于一个文件。两个文件不能声明同名模块,要跨文件合并,双方都必须声明 partial module:

// pack-api.ms partial module Pack; public func Api() -> string => "包内可用";
// pack-main.ms partial module Pack; func main() -> int { print(Api()); return 0; }

合并后的两个文件同属一个模块,internal 成员互相可见。

同名函数

两个模块各自声明同名函数,调用需按模块名精确访问:

// a.ms module A; public func Go() -> string => "甲走";
// b.ms module B; public func Go() -> string => "乙走";
// main.ms import A.*; import B.*; print(A.Go(), B.Go());
甲走 乙走

注意

  • 一个包里 func main 只能出现在一个模块,两个模块各写一个 main,mush run 无法选入口。
  • 同包模块之间循环 import 合法,包级依赖环才被禁止。
  • extern module Name; 是宿主注入模块的引用面,只在内置包合法,用户文件无法声明,见宿主边界。
最后更新于 2026年10月10日