Skip to content

06 Modules

这部分介绍 YIAN 中的模块系统. 模块系统用于多文件情况下组织代码.

Module

YIAN 中, 每个源代码文件(.an)是一个模块, 在模块顶层被标记为 pub 的项(函数, 结构体, 枚举, trait 等)可以被其他模块通过 import 语句访问.

Import

YIAN 的 import 被设计为一种单纯的名称暴露机制, 具体语法详见引言章节, 其作用是将一个模块中的项暴露到另一个模块中, 以便在另一个模块中使用. 除了扩大一个名称的可见范围之外, import 不会引入任何其他的副作用, 以及运行时开销. 因此, 循环 import 是被允许的(例如, 两个模块相互导入对方的项). 下面是一个实例:

目录结构:

src/
├── person.an
└── car.an

文件内容:

// person.an
from car import Car

pub struct Person {
    Car* car
}

// car.an
from person import Person

pub struct Car {
    Person* owner
}

访问权限

YIAN 的访问权限较为简单: 通过 pub 关键字标记的项可以被其他模块访问, 没有 pub 标记的项只能在当前模块内访问

除了模块顶层的项适用于这个规则以外, 方法和结构体的字段也适用于这个规则, 例如:

pub struct Person {
    pub String name
    int age
}

impl Person {
    pub static Self new(String name, int age) {
        return Self(name, age)
    }
}

foo(Person* p) {
    p.age += 1
}

在上面的例子中, age 字段并不是 pub 的, 但是由于方法 new 和函数 fooage 字段在同一个模块内, 因此它们可以访问 age 字段.