Rust Package

Table of Contents

1. Rust Package

1.1. Overview

  • package 指最顶层的 cargo porject
  • 一个 package 可以包含多个 crate, 每个 crate 包含一个对应的 Cargo.toml
  • 一个 crate 包含多个 mod, 并构成一棵 mod 树
/home/sunway/hello_rust/
├── Cargo.lock
├── Cargo.toml
├── hello
│   ├── Cargo.toml
│   └── src
│       ├── main.rs
│       └── mod_one.rs
└── util
    ├── Cargo.toml
    └── src
        ├── lib.rs
        ├── mod_three
        │   └── mod.rs
        └── mod_two.rs

1.2. package

hello_rust 是一个 package, 其 Cargo.toml 为:

[workspace]
members = [
    "hello",
    "util",
]

表示这个 package 包含两个 crate: hello 和 util

1.3. crate

hello 和 util 有其单独的 Cargo.toml, 其中 hello 是 bin, util 是 lib

bin 与 lib 的区别在于:

  • bin 的入口是 src/main.rs
  • lib 的入口是 src/lib.rs

hello/Cargo.toml:

[package]
name = "hello"
version = "0.1.0"
authors = ["sunway <[email protected]>"]
edition = "2018"

[dependencies]
util = {path="../util"}

util/Cargo.toml:

[package]
name = "util"
version = "0.1.0"
authors = ["sunway <[email protected]>"]
edition = "2018"

[dependencies]

1.4. mod

每个 crate 定义的所有 mod 构成一个 mod 树. 定义 mod 有三种方法:

  1. 直接在 lib.rs 或 main.rs 中通过 mod foo {} 定义 foo mod
  2. 在 src/foo.rs 中定义 foo mod
  3. 在 src/foo/mod.rs 中定义 foo mod.

util/mod.rs:

pub mod mod_one {
    pub fn foo() {
        println!("{:?}", "foo of util::mod_one");
    }
}

pub mod mod_two;

util/mod_two.rs:

pub fn foo() {
    println!("{:?}", "foo of util::mod_two");
}

mod_one 是 util 的子模块, 因为 mod_one 直接定义在 util.rs 中.

mod_two 也是 util 的子模块, 因为通过 mod mod_two, 可以把 mod_two `挂在` util 的下.

最终所有的 mod 通过需要通过上述两种方法加入 mod 树.

1.4.1. mod 使用

main.rs:

mod mod_one;

fn foo() -> () {
    println!("{:?}", "foo of hello");
}

mod mod_two {
    pub fn foo() -> () {
        println!("{:?}", "foo of mod_two");
        print!(" -> ");
        // super::用来引用 parent mod
        super::foo();
    }

}
fn main() {
    util::mod_one::foo();
    util::mod_two::foo();
    util::mod_three::foo();
    foo();
    crate::foo();
    mod_one::foo();
    crate::mod_one::foo();
    mod_two::foo();
}

hello 这个 bin 有两个 crate 的 mod 可用:

  1. hello crate, 可以忽略或通过 `crate` 关键字访问
  2. util crate, 可以通过 `util` 访问

1.5. use

use 可以简单的看作是别名, 用来把上面的 util::mod_one::foo 简化为 foo

每段代码在 mod 树上都有确定的路径, use 时可以用 use crate_name::mod_name 这种绝对的形式, 也可以用相对于当前 mod 的形式,例如 use mod_one::foo.

另外, 对于 main.rs 和 lib.rs 中那些没有定义在特定 mod 中的代码, 可以直接通过 crate 名字来引用.

1.6. sample

base64 -d {} |tar jxvf -

QlpoOTFBWSZTWdBiLa8ABAb/z8aQAQBwd//f28ZxCv/v36pIAAIgAAsAAIAQAAhQA/50AItAADSm
pkMmgGgyAAMgaDRkAAAG1DjJk0YhpoYCaGJo0yYgZGE0aaYQZMMmkaIoAAAAAAAAAAAA4yZNGIaa
GAmhiaNMmIGRhNGmmEGTCJRAKYjTTFMGkRibUaMh6mNRkeoZGg2p5T4IH6ume31ylPbWxNZyDEO/
PBxQI/GqdVaEVJmEBdMQObl3bt3QaNEtutLa2YlwgXqVFlIJodCJvOSasBNPDECFRIsQBaCALCwY
CyEUWgFAiGj5s+/W7UU5LIXVDq6Kp8ViQlfgYZNxg4lcaUgYUpYFQslmSBmFH4IEACqp09I5DCsP
eWBl4wxU54PMe8egPCFuQe5LR7CUewKzONHeCmNG/ZgPH5yO8YHTjTioUbLdo5XDqIBw8hRpkOHS
uVpIzPSglqhrZA2HlPpKoXJPP9CaU4zOYG8eDipo485Vs7CmHgtK1rSlFsLYFlhCPaaLgOBTR5RA
4PNUp5qCBemoL+m+1QOmCB1dW719c9nslK/jfT8/b7vGoOYQIgQQNTxa+GV+/VW2ymxLbPwcDFAi
GEMY0121kBCuNmFZlTaX2llLPVvZBbBZhbjYgNUgB4TEAMGpIF2hEhKLQ6EJEAISahIrKYUMcUFJ
yZUJADiVZ1aSYirJmEA0QcwqATENCmp0Vlsg9ySK1cqQaxihYmRIAgGpdjfdQsrCrcbg556abpWi
dQ9YBU9ClsThQDlH0kOghgogRJq+gRgX656+mPrNLfMd88AbFQU0gAhMCzgYdZKeueQ5DsJZD2Am
KB2pwhyB1h6lD0pzF2c7xQ7gO7H0F4H/bzsKBYaCojY5azSYGIWlYQk36EpT8u4MC9PKp8kDHW6m
M7zsganIxOAeYzRkOUYGrzAbjaGBtO0zFU25GU6RpVfJtaAZEFhevQFTSay44jTQL9joFLM/IC5D
nBdJrM5wX38Aa7m3xSsumwpmoVlSUZSVrcP8rmHQYBvDaBmLF3ChUDovJJKI2lY1GhJFDSI5DqOF
xHuAzonQQx6Dj8IfZpdPq4iENpJJrPAgXOkyA2GZIWr4lpyJfQoUDlGQIQPHzAb4gaED5IHhO04c
TbwCBib7keBOMoCQuHfbF0gYKh3IHegYmjZHMhz8Mkm+WhnFDnXlxBC6F6GIyXpZCd4xRf/F3JFO
FCQ0GItrwA==

Author: [email protected]
Date: 2019-02-13 Wed 00:00
Last updated: 2020-11-16 Mon 20:28

知识共享许可协议