13. 模块与项目
超过一个文件就是一个项目。目录约定:模块放在 src/ 下,入口是 src/main.dawn。
一个 .dawn 文件 = 一个模块,模块路径就是它相对 src/ 的路径。
myapp/
└── src/
├── main.dawn
└── util/
└── math.dawn # 模块 util/math
默认所有声明模块私有,pub 才导出。引入有两种:use util/math 整模块引入
(限定访问 math.double(x),别名取路径末段),或 use util/math.{double} 选择性
引入(直接用 double)。类型、构造器、常量跨模块只能走选择性引入。
src/util/math.dawn:
pub fn double(x: Int) -> Int = x * 2
pub type Shape =
| Circle(r: Float)
| Square(side: Float)
derive Show
在 Playground 打开
src/main.dawn:
use util/math
use util/math.{Shape, Circle, Square}
pub fn main() -> Unit !io = {
println(to_string(math.double(21)))
println(to_string(Circle(2.0)))
}
在 Playground 打开
用 dawn run myapp(传目录)编译并运行整个项目;dawn test myapp 跑所有模块的
test 块,dawn build myapp 打成一个 jar。单文件的 dawn run foo.dawn 依然可用。
循环 use 是编译错误;一个名字与被引入模块的别名相同也会报错——它们共享一个命名空间。