|
|
@ -95,9 +95,9 @@ let slice = &s[..];
|
|
|
|
> ```
|
|
|
|
> ```
|
|
|
|
>
|
|
|
|
>
|
|
|
|
> 因为我们只取 `s` 字符串的前两个字节,但是本例中每个汉字占用三个字节,因此没有落在边界处,也就是连 `中` 字都取不完整,此时程序会直接崩溃退出,如果改成 `&s[0..3]`,则可以正常通过编译。
|
|
|
|
> 因为我们只取 `s` 字符串的前两个字节,但是本例中每个汉字占用三个字节,因此没有落在边界处,也就是连 `中` 字都取不完整,此时程序会直接崩溃退出,如果改成 `&s[0..3]`,则可以正常通过编译。
|
|
|
|
> 因此,当你需要对字符串做切片索引操作时,需要格外小心这一点, 关于该如何操作 UTF-8 字符串,参见[这里](#操作-utf-8-字符串)。
|
|
|
|
> 因此,当你需要对字符串做切片索引操作时,需要格外小心这一点,关于该如何操作 UTF-8 字符串,参见[这里](#操作-utf-8-字符串)。
|
|
|
|
|
|
|
|
|
|
|
|
字符串切片的类型标识是 `&str`,因此我们可以这样声明一个函数,输入 `String` 类型,返回它的切片: `fn first_word(s: &String) -> &str `。
|
|
|
|
字符串切片的类型标识是 `&str`,因此我们可以这样声明一个函数,输入 `String` 类型,返回它的切片:`fn first_word(s: &String) -> &str `。
|
|
|
|
|
|
|
|
|
|
|
|
有了切片就可以写出这样的代码:
|
|
|
|
有了切片就可以写出这样的代码:
|
|
|
|
|
|
|
|
|
|
|
@ -152,7 +152,7 @@ assert_eq!(slice, &[2, 3]);
|
|
|
|
|
|
|
|
|
|
|
|
## 字符串字面量是切片
|
|
|
|
## 字符串字面量是切片
|
|
|
|
|
|
|
|
|
|
|
|
之前提到过字符串字面量,但是没有提到它的类型:
|
|
|
|
之前提到过字符串字面量,但是没有提到它的类型:
|
|
|
|
|
|
|
|
|
|
|
|
```rust
|
|
|
|
```rust
|
|
|
|
let s = "Hello, world!";
|
|
|
|
let s = "Hello, world!";
|
|
|
@ -705,9 +705,9 @@ for b in "中国人".bytes() {
|
|
|
|
// s 不再有效,内存被释放
|
|
|
|
// s 不再有效,内存被释放
|
|
|
|
```
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
与其它系统编程语言的 `free` 函数相同,Rust 也提供了一个释放内存的函数: `drop`,但是不同的是,其它语言要手动调用 `free` 来释放每一个变量占用的内存,而 Rust 则在变量离开作用域时,自动调用 `drop` 函数: 上面代码中,Rust 在结尾的 `}` 处自动调用 `drop`。
|
|
|
|
与其它系统编程语言的 `free` 函数相同,Rust 也提供了一个释放内存的函数: `drop`,但是不同的是,其它语言要手动调用 `free` 来释放每一个变量占用的内存,而 Rust 则在变量离开作用域时,自动调用 `drop` 函数:上面代码中,Rust 在结尾的 `}` 处自动调用 `drop`。
|
|
|
|
|
|
|
|
|
|
|
|
> 其实,在 C++ 中,也有这种概念: _Resource Acquisition Is Initialization (RAII)_。如果你使用过 RAII 模式的话应该对 Rust 的 `drop` 函数并不陌生。
|
|
|
|
> 其实,在 C++ 中,也有这种概念:_Resource Acquisition Is Initialization (RAII)_。如果你使用过 RAII 模式的话应该对 Rust 的 `drop` 函数并不陌生。
|
|
|
|
|
|
|
|
|
|
|
|
这个模式对编写 Rust 代码的方式有着深远的影响,在后面章节我们会进行更深入的介绍。
|
|
|
|
这个模式对编写 Rust 代码的方式有着深远的影响,在后面章节我们会进行更深入的介绍。
|
|
|
|
|
|
|
|
|
|
|
|