您的位置:首页 > 其它

Rust 中包访问策略和module开发策略

2016-03-17 21:54 323 查看

一、创建新项目

$cargo new my_library


当前路径下包含 Cargo.toml 和 src 目录;

src 目录下包含一个 lib.rs 文件。

二、不使用module的情况

1、修改lib代码

$vi src/lib.rs


修改代码如下:

pub fn public_function() {
println!(" my library's `public_function()` called");
}

fn private_function() {
println!(" my library's `private_function()` called");
}

pub fn indirect_access() {
print!("my library's `indirect_access()` called ");
private_function();
}


Rust 中所有的功能函数默认都是私有的 private,只允许同一个文件内的功能函数访问。为了能让其他包中的功能函数访问,必须在 fn 前面声明 pub 。

2、创建调用文件

$vi src/main.rs


文件内容如下:

extern crate my_library;

fn main() {
my_library::public_function();
my_library::indirect_access();
}


代码中 my_library 是我们前面创建的项目名称,也叫 crate 。

extern crate 链接 my_library,在当前文件内可以使用 my_library访问的功能函数。

lib.rs 是 Rust 创建的默认的module,module的名字就是项目的名字或者叫做 crate的名字:my_library。

因此,在调用的时候,需要使用 my_library加上两个 : 冒号,来调用功能函数。

$cargo run


$ cargo run
Compiling my_library v0.1.0 (file:///Users/teamlet/develop/rust-projects/my_library)
Running `target/debug/my_library`
my library's `public_function()` called
my library's `indirect_access()` called  my library's `private_function()` called


三、使用单文件module

1、修改lib代码

vi src/lib.rs


pub mod english {
pub  mod greetings {
pub fn hello() -> String {
"Hello!".to_string()
}
}

pub  mod farewells {
pub fn goodbye() -> String {
"Goodbye.".to_string()
}
}
}

pub mod chinese {
pub mod greetings {
pub fn hello() -> String {
"你好!".to_string()
}
}

pub mod farewells {
pub fn goodbye() -> String {
"再见.".to_string()
}
}
}


上面代码中,english和chinese是 root module 根模块的的两个子模块,root module 的名字是 my_library!

每个子模块下面又包含两个子模块 greetings 和farewells 。

因为要在模块外部访问功能方法,所以所有的module和功能函数都要声明为 pub 即:public属性。

2、创建调用文件

$vi src/main.rs


extern crate my_library;

fn main() {
println!("Hello in English: {}",my_library::english::greetings::hello());
println!("Goodbye in English: {}", my_library::english::farewells::goodbye());

println!("Hello in Chinese: {}", my_library::chinese::greetings::hello());
println!("Goodbye in Chinese: {}", my_library::chinese::farewells::goodbye());
}


运行

$cargo run


$ cargo run
Running `target/debug/my_library`
Hello in English: Hello!
Goodbye in English: Goodbye.
Hello in Chinese: 你好!
Goodbye in Chinese: 再见.


在调用代码中,功能函数通过 :: 从root module (这里是 my_library)一层一层的访问子模块直到最后的功能函数。

四、使用多文件module

从上面的代码可以看出,一个 crate 就是一个 rs 文件。

在rs文件中,通过mod和 { } 把root module 下的子模块规划出来。

mod 可以包含任意个子模块。

当一个文件中的mod数量太多,也会出现阅读、修改、管理的问题。

Rust提供机制,可以将 mod 分别保存在不同的文件中。

1、修改lib代码

$vi src/lib.rs


pub mod english;
pub mod chinese;


Rust会查找 src/english.rs 或者 src/english/mod.rs

同样,也会查找 src/chinese.rs 或者 src/chinese/mod.rs

因为还有第三层的module,所以选择后面一种方式。

创建 src/english/mod.rs 和 src/chinese/mod.rs

$mkdir src/english
$vi src/english/mod.rs


内容如下:

pub mod greetings;
pub mod farewells;


$mkdir src/chinese
$vi src/chinese/mod.rs


内容如下:

pub mod greetings;
pub mod farewells;


这是,Rust会分别在english目录和chinese目录下查找greetings.rs或者 greetings/mod.rs ,也会同样查找 farewells.rs 或者 farewells/mod.rs 。

因为这两个mod不再包含子模块,所以采用greetings.rs和farewells.rs 的方式。

$vi src/english/greetings.rs


内容如下:

pub fn hello() -> String {
"Hello!".to_string()
}


$vi src/english/farewell.rs


内容如下:

pub fn goodbye() -> String {
"Goodbye.".to_string()
}


$vi src/chinese/greetings.rs


内容如下:

pub fn hello() -> String {
"你好!".to_string()
}


$vi src/chinese/farewells.rs


内容如下:

pub fn goodbye() -> String {
"再见.".to_string()
}


2、调用代码不变,如下

extern crate my_library;

fn main() {
println!("Hello in English: {}", my_library::english::greetings::hello());
println!("Goodbye in English: {}", my_library::english::farewells::goodbye());

println!("Hello in Chinese: {}", my_library::chinese::greetings::hello());
println!("Goodbye in Chinese: {}", my_library::chinese::farewells::goodbye());
}


运行

$cargo run


cargo run
Compiling my_library v0.1.0 (file:///Users/teamlet/develop/rust-projects/my_library)
Running `target/debug/my_library`
Hello in English: Hello!
Goodbye in English: Goodbye.
Hello in Chinese: 你好!
Goodbye in Chinese: 再见.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: