|
|
@ -142,73 +142,6 @@ Hello, world! 10 plus one is 11!
|
|
|
|
这会运行 *adder/src/main.rs* 中的代码,其依赖 `add-one` crate
|
|
|
|
这会运行 *adder/src/main.rs* 中的代码,其依赖 `add-one` crate
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
接下来,在 `adder` 目录中生成 `add-one` crate:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```text
|
|
|
|
|
|
|
|
$ cargo new add-one
|
|
|
|
|
|
|
|
Created library `add-one` project
|
|
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
现在 `adder` 目录应该有如下目录和文件:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```text
|
|
|
|
|
|
|
|
├── Cargo.toml
|
|
|
|
|
|
|
|
├── add-one
|
|
|
|
|
|
|
|
│ ├── Cargo.toml
|
|
|
|
|
|
|
|
│ └── src
|
|
|
|
|
|
|
|
│ └── lib.rs
|
|
|
|
|
|
|
|
└── src
|
|
|
|
|
|
|
|
└── main.rs
|
|
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
在 *add-one/src/lib.rs* 中增加 `add_one` 函数的实现:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<span class="filename">文件名: add-one/src/lib.rs</span>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```rust
|
|
|
|
|
|
|
|
pub fn add_one(x: i32) -> i32 {
|
|
|
|
|
|
|
|
x + 1
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
打开 `adder` 的 *src/main.rs* 并增加一行 `extern crate` 将新的 `add-one` 库引入作用域,并修改 `main` 函数来调用 `add_one` 函数,如示例 14-12 所示:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```rust,ignore
|
|
|
|
|
|
|
|
extern crate add_one;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
fn main() {
|
|
|
|
|
|
|
|
let num = 10;
|
|
|
|
|
|
|
|
println!("Hello, world! {} plus one is {}!", num, add_one::add_one(num));
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<span class="caption">示例 14-12:使用来自 `adder` crate 的库 crate `add-one`</span>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
在 *adder* 目录下运行 `cargo build` 来构建 `adder` crate!
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```text
|
|
|
|
|
|
|
|
$ cargo build
|
|
|
|
|
|
|
|
Compiling add-one v0.1.0 (file:///projects/adder/add-one)
|
|
|
|
|
|
|
|
Compiling adder v0.1.0 (file:///projects/adder)
|
|
|
|
|
|
|
|
Finished dev [unoptimized + debuginfo] target(s) in 0.68 secs
|
|
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
注意这会构建 `adder` crate 和 *adder/add-one* 中的 `add-one` crate。现在 *adder* 目录中应该有这些文件:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```text
|
|
|
|
|
|
|
|
├── Cargo.lock
|
|
|
|
|
|
|
|
├── Cargo.toml
|
|
|
|
|
|
|
|
├── add-one
|
|
|
|
|
|
|
|
│ ├── Cargo.toml
|
|
|
|
|
|
|
|
│ └── src
|
|
|
|
|
|
|
|
│ └── lib.rs
|
|
|
|
|
|
|
|
├── src
|
|
|
|
|
|
|
|
│ └── main.rs
|
|
|
|
|
|
|
|
└── target
|
|
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#### 在工作空间中依赖外部 crate
|
|
|
|
#### 在工作空间中依赖外部 crate
|
|
|
|
|
|
|
|
|
|
|
|
还需注意的是工作空间只在根目录有一个 *Cargo.lock*,而不是在每一个 crate 目录都有 *Cargo.lock*。这确保了所有的 crate 都使用完全相同版本的依赖。如果在 *Cargo.toml* 和 *add-one/Cargo.toml* 中都增加 `rand` crate,则 Cargo 会将其都解析为同一版本并记录到唯一的 *Cargo.lock* 中。使得工作空间中的所有 crate 都使用相同的依赖意味着其中的 crate 都是相互兼容的。让我们在 *add-one/Cargo.toml* 中的 `[dependencies]` 部分增加 `rand` crate 以便能够在 `add-one` crate 中使用 `rand` crate:
|
|
|
|
还需注意的是工作空间只在根目录有一个 *Cargo.lock*,而不是在每一个 crate 目录都有 *Cargo.lock*。这确保了所有的 crate 都使用完全相同版本的依赖。如果在 *Cargo.toml* 和 *add-one/Cargo.toml* 中都增加 `rand` crate,则 Cargo 会将其都解析为同一版本并记录到唯一的 *Cargo.lock* 中。使得工作空间中的所有 crate 都使用相同的依赖意味着其中的 crate 都是相互兼容的。让我们在 *add-one/Cargo.toml* 中的 `[dependencies]` 部分增加 `rand` crate 以便能够在 `add-one` crate 中使用 `rand` crate:
|
|
|
|