Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

模块、use 与包

模块负责组织名字和可见性,use 负责把路径引入当前作用域,Clue 的包依赖则构成项目之间的边界。枚举已经拆到枚举、模式与 match

内联模块

使用 mod name { ... } 定义内联模块:

mod math {
    pub fun one() -> i32 {
        1
    }
}

fun main() -> i32 {
    math::one()
}

模块中的项默认私有。只有 pub 项能从模块外通过路径访问。pub 也可以用于结构体字段、结构体、枚举、trait、const、type alias 和 use

文件模块

通过 riddlec 或 Clue 从文件加载源码时,可以声明外部模块:

mod math;
pub mod util;

编译器会在当前模块目录下寻找 name.ridname/mod.rid,两者同时存在会报错。模块不会仅因为文件存在就自动加入编译,父模块必须写出对应的 mod 声明。

目录按层级推进。src/main.rid 中的 mod foo; 会读取 src/foo.ridsrc/foo/mod.rid;进入 foo 后,其中的 mod bar; 会继续读取 src/foo/bar.ridsrc/foo/bar/mod.rid

路径可以使用 selfsupercrate 和以 :: 开头的绝对形式。

use 与重新导出

use 可以导入普通路径、别名、glob 或列表:

use crate::math::one;
use crate::math::one as one_value;
use crate::math::*;
use crate::{math::one, util::helper as help};

pub use 会重新导出名字,可用于隐藏内部模块结构:

mod math {
    mod inner {
        pub fun one() -> i32 { 1 }
    }

    pub use self::inner::one;
}

过程宏也使用独立宏命名空间中的 use,支持分组、别名、glob、混合导入和通过模块 pub use 重新导出。具体清单与示例见Clue 构建器

包依赖也是模块

Clue 的本地 path 依赖会以依赖键作为当前包中的模块名:

[dependencies]
math = { path = "../math" }

当前包可以访问依赖公开导出的项:

fun main() -> i32 {
    math::one()
}

依赖键与真实包名不同时,使用 Cargo 风格的 package 字段:

[dependencies]
math = { package = "math-core", path = "../math-core" }

Clue 支持 path、git 和 sparse registry 依赖,并使用 Clue.lock 锁定版本、git revision、registry checksum 和源码指纹。完整项目布局、feature 和入口规则见创建与构建项目