|
|
|
@ -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]` 没有任何意义,因为你取不到 `中` 这个字符,而是取到了这个字符三个字节中的第一个字节,这是一个非常奇怪而且难以理解的返回值。
|
|
|
|
|
|
|
|
|
|
#### 字符串的不同表现形式
|
|
|
|
|
现在看一下用梵文写的字符串 `“नमस्ते”`, 它底层的字节数组如下形式:
|
|
|
|
|