使用mod
关键字定义我们的模块:
定义了四个子模块chinese::{greetings, farewells}
和english::{greetings, farewells}
。
模块默认是私有的,可以使用pub
关键字将其设置成公开,只有公开的条目才允许在模块外部访问。
实践中更好的组织方式是将一个包装箱分拆到多个文件:
// in src/lib.rs
pub mod chinese;
pub mod english;
这两句声明告诉Rust查看src/chinese.rs
和src/english.rs
,
或者src/chinese/mod.rs
和src/english/mod.rs
。
先添加一些函数:
// in src/chinese/greetings.rs
pub fn hello() -> String {
"你好!".to_string()
}
// in src/chinese/farewells.rs
pub fn goodbye() -> String {
"再见!".to_string()
}
// in src/english/farewells.rs
pub fn goodbye() -> String {
"Goodbye!".to_string()
}
为了使用我们前面创建的名为的包装箱,需要先声明导入
// in src/main.rs
fn main() {
println!("Hello in Chinese: {}", phrases::chinese::greetings::hello());
}
Rust还有一个use
关键字,允许我们导入包装箱中的条目到当前的作用域内:
// in src/main.rs
extern crate phrases;
use phrases::chinese::greetings;
use phrases::chinese::farewells::goodbye;
fn main() {
println!("Hello in Chinese: {}", greetings::hello());
println!("Goodbye in Chinese: {}", goodbye());
}
但是,我们不推荐直接导入函数,这样更容易导致命名空间冲突,只导入模块是更好的做法。
如果要导入来自同一模块的多个条目,可以使用大括号简写:
如果是导入全部,可以使用通配符*
。重命名可以使用as
关键字:
use phrases::chinese::greetings as chinese_greetings;
// in src/english/mod.rs
pub use self::greetings::hello;
pub use self::farewells::goodbye;
mod greetings;
mod farewells;
其中声明将函数带入了当前模块中,
使得我们现在有了phrases::hello()
函数和phrases:
函数,:goodbye()
即使它们的定义位于phrases:
:hello()
和phrases:
中,:goodbye()
内部代码的组织结构不能反映我们的扩展接口。
默认情况下,use
声明表示从根包装箱开始的绝对路径。
此外,我们可以使用use self::
表示相对于当前模块的位置,use super::
表示当前位置的上一级,以::
为前缀的路径表示根包装箱路径。
use foo::baz::foobaz; // foo is at the root of the crate
mod foo {
use foo::bar::foobar; // foo is at crate root
use self::baz::foobaz; // self refers to module 'foo'
pub mod bar {
pub fn foobar() { }
}
pub mod baz {
use super::bar::foobar; // super refers to module 'foo'
pub fn foobaz() { }
}
}
在Rust中,属性 (attribute) 是应用于包装箱、模块或者条目的元数据 (metadata),
主要用于:
- 实现条件编译 (conditional compilation)
- 设置包装箱名字、版本以及类型
- 取消可疑代码的警告
- 设置编译器选项
- 链接外部库
- 标记测试函数
属性有两种语法:#![crate_attribute]
应用于整个包装箱,
而#[crate_attribute]
应用于紧邻的一个模块或者条目。
属性的参数也有三种不同的形式:
#[attribute = "value"]
#[attribute(key = "value")]
#[attribute(value)]
#[path="foo.rs"]
用于设置一个模块需要载入的文件路径。#[allow(dead_code)]
用于取消对死代码的默认lint检查。#[derive(PartialEq, Clone)]
用于自动推导和Clone
这两个特性的实现。