pull/423/head
sunface 3 years ago
commit 156879bff2

@ -107,7 +107,7 @@ fn function2() -> IoResult<()> {
- `IoResult` 代表 `std:io::Result`
## 引入项再导出
当外部的模块项 `A` 被引入到当前模块中时,它的可见性自动被设置为私有的,如果你允许其它外部代码引入我们模块中的 `A`,那么可以对它进行再导出:
当外部的模块项 `A` 被引入到当前模块中时,它的可见性自动被设置为私有的,如果你希望允许其它外部代码引用我们的模块项 `A`,那么可以对它进行再导出:
```rust
mod front_of_house {
pub mod hosting {
@ -128,11 +128,11 @@ pub fn eat_at_restaurant() {
当你希望将内部的实现细节隐藏起来或者按照某个目的组织代码时,可以使用 `pub use` 再导出,例如统一使用一个模块来提供对外的 API那该模块就可以引入其它模块中的 API然后进行再导出最终对于用户来说所有的 API 都是由一个模块统一提供的。
## 使用三方包
之前我们一直在引入标准库模块或者自定义模块,现在来引入下三方包中的模块,关于如何引入外部依赖,我们在[Cargo入门](../../first-try/cargo.md#package配置段落)中就有讲,这里直接给出操作步骤:
## 使用三方包
之前我们一直在引入标准库模块或者自定义模块,现在来引入下三方包中的模块,关于如何引入外部依赖,我们在 [Cargo 入门](../../first-try/cargo.md#package 配置段落)中就有讲,这里直接给出操作步骤:
1. 修改 Cargo.toml 文件,在 `[dependencies]` 区域添加一行:`rand = "0.8.3"`
2. 此时,如果你用的是 `VSCode``rust-analyzer` 插件,该插件会自动拉取该库,你可能需要等它完成后,再进行下一步(VSCODE左下角有提示)
1. 修改 `Cargo.toml` 文件,在 `[dependencies]` 区域添加一行:`rand = "0.8.3"`
2. 此时,如果你用的是 `VSCode``rust-analyzer` 插件,该插件会自动拉取该库,你可能需要等它完成后,再进行下一步VSCode 左下角有提示)
好了,此时,`rand` 包已经被我们添加到依赖中,下一步就是在代码中使用:
```rust
@ -143,10 +143,10 @@ fn main() {
}
```
这里使用 `use` 引入了三方包 `rand` 中的 `Rng` 特征,因为我们需要调用的 `gen_range` 方法定义在该特征中。
这里使用 `use` 引入了三方包 `rand` 中的 `Rng` 特征,因为我们需要调用的 `gen_range` 方法定义在该特征中。
#### crates.iolib.rs
Rust 社区已经为我们贡献了大量高质量的三方包,你可以在 `crates.io` 或者 `lib.rs` 中检索和使用,从目前来说查找包更推荐 `lib.rs`,搜索功能更强大,内容展示也更加合理,但是下载依赖包还是得用`crates.io`。
Rust 社区已经为我们贡献了大量高质量的三方包,你可以在 `crates.io` 或者 `lib.rs` 中检索和使用,从目前来说查找包更推荐 `lib.rs`,搜索功能更强大,内容展示也更加合理,但是下载依赖包还是得用`crates.io`。
你可以在网站上搜索 `rand` 包,看看它的文档使用方式是否和我们之前引入方式相一致:在网上找到想要的包,然后将你想要的包和版本信息写入到 `Cargo.toml` 中。

@ -87,7 +87,7 @@ let slice = &s[..];
> let a = &s[0..2];
> println!("{}",a);
>```
>因为我们只取 `s` 字符串的前两个字节,但是一个中文占用三个字节,因此没有落在边界处,也就是连 `中` 字都取不完整,此时程序会直接崩溃退出,如果改成 `&s[0..3]`,则可以正常通过编译。
>因为我们只取 `s` 字符串的前两个字节,但是本例中每个汉字占用三个字节,因此没有落在边界处,也就是连 `中` 字都取不完整,此时程序会直接崩溃退出,如果改成 `&s[0..3]`,则可以正常通过编译。
> 因此,当你需要对字符串做切片索引操作时,需要格外小心这一点, 关于该如何操作 UTF8 字符串,参见[这里](#操作UTF8字符串)
字符串切片的类型标识是 `&str`,因此我们可以这样声明一个函数,输入 `String` 类型,返回它的切片: `fn first_word(s: &String) -> &str `
@ -263,7 +263,7 @@ fn say_hello(s: &str) {
```rust
let hello = String::from("中国人");
```
如果问你该字符串多长,你可能会说 `3`,但是实际上是 `9` 个字节的长度,因为每个汉字在 UTF8 中的长度是 `3` 个字节,因此这种情况下对 `hello` 进行索引,访问 `&hello[0]` 没有任何意义,因为你取不到 `中` 这个字符,而是取到了这个字符三个字节中的第一个字节,这是一个非常奇怪而且难以理解的返回值。
如果问你该字符串多长,你可能会说 `3`,但是实际上是 `9` 个字节的长度,因为大部分常用汉字在 UTF8 中的长度是 `3` 个字节,因此这种情况下对 `hello` 进行索引,访问 `&hello[0]` 没有任何意义,因为你取不到 `中` 这个字符,而是取到了这个字符三个字节中的第一个字节,这是一个非常奇怪而且难以理解的返回值。
#### 字符串的不同表现形式
现在看一下用梵文写的字符串 `“नमस्ते”`, 它底层的字节数组如下形式:

@ -1,6 +1,6 @@
# 不仅仅是 Hello world
几乎所有教程中安装的最后一个环节都是 `hello world`,我们也不能免俗。但是,在 `hello world` 之后,还有一个相亲,Rust 初印象环节,希望大家喜欢。
几乎所有教程中安装的最后一个环节都是 `hello world`,我们也不能免俗。但是,在 `hello world` 之后,还有一个相亲,Rust 初印象环节,希望大家喜欢。
## 多国语言的"世界,你好"
@ -98,7 +98,7 @@ fn main() {
}
```
看完这段代码,不知道你的余音有没有嘎然而止,反正我已经在颤抖了。这就是传说中的下马威嘛?😵
看完这段代码,不知道你的余音有没有戛然而止,反正我已经在颤抖了。这就是传说中的下马威吗?😵
上面代码中,值得注意的 Rust 特性有:

Loading…
Cancel
Save