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

一、创建新项目

$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: 再见.
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值