Crate、Mod、可见性、文件结构

文件结构规则

拆分文件

Rust一般库中文件名/文件夹都表示mod (测试文件规则比较特殊)

  • modfoo在其父modbar中声明
  • 如果modfoo没有子mod,将其实现放在foo.rs文件中
  • 若modfoo有子mod,创建文件夹foo,将其实现放在 foo/mod.rs

以上是文件拆分规则,也可以不拆分文件

库Crate

库crate中lib.rs相当于该crate顶层mod(根mod)

  • 所有的mod直接或间接(祖先mod)声明于此,否则不能识别
  • 从引用库crate的外部crate角度来看,其名称和库crate同名 extern crate crate_name;的同时就use crate_name;, 此时可将引用其的mod视为根mod的父mod

库、二进制Crate

crate中可以同时有lib.rs和main.rs,此时库crate和二进制 crate应该看作相互独立

  • 在两处都使用mod关键字声明定义mod(不能在main.rs 中使用use声明使用mod)

  • main.rs中使用extern crate crate_name引入 “外部”库crate

可见性规则

Mod默认私有

  • 默认仅crate内部可见
    • 父mod处直接可用
    • 兄弟mod、子mod可以通过“回溯“声明使用
  • pub声明为公用后,对外部crate也可见

Fn默认私有

  • 默认仅mod“内部”可见(包括后代mod)
    • 当前mod内直接可用
    • 子mod可以通过“回溯”声明可用
  • pub声明为公用后,对外部mod也可见

说明

  • 项(mod、fn)的声明使用路径都是相对于当前项,即默认调用 其后代项(mod、fn),通过以下“回溯”方式调用非直接后代项
    • super直接父mod路径起始:super::child_mod
    • ::根mod起始:::child_mod
  • fn和mod的可见规则相似的,只是注意:fn是否可见只与mod有关 ,mod是否可见只有crate有关。从这个意义上说,crate不能 看作是“大号“的mod

相关关键字

好像都是单一用途(意义),罕见

  • extern引入外部crate(同时包含use crate_name;
  • crate:标记外部crate
  • mod/fn声明定义(注册)mod/fn(同crate内仅一次 ,位于其父mod处)
  • use声明使用项(mod、fn),用于缩略代码