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 是编译错误;一个名字与被引入模块的别名相同也会报错——它们共享一个命名空间。