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: 再见.
相关文章推荐
- 练习脚本三:日志清除
- IOS APP 上传到AppStore
- uva 414 Machined Surfaces
- Python list、tuple、dict区别
- 【2011集训队出题】Crash的数字表格
- VMWare 12 序列号/注册机
- 第三周项目10-小学生计算题的随机生成
- IMMNotificationClient interface(MSDN理解)
- 20.ELK实时日志分析平台之Elasticsearch 查询简介
- OC中的字典NSDictionary
- 练习脚本二:批量添加用户
- 任务三:三栏式布局
- Python:OS 模块 -- 进程管理
- win10下apache不能正常启动的解决方案之一
- VPCS不能通过dhcp协议在win server下获取ip地址的验证性试验
- iOS 开发基础UIControl事件
- onDraw绘画
- 总结
- 复利计算
- 网站根目录的问题