模块(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日
