|
|
@ -64,7 +64,7 @@ let slice = &s[0..2];
|
|
|
|
let slice = &s[..2];
|
|
|
|
let slice = &s[..2];
|
|
|
|
```
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
同样的,如果你的切片想要包含 `String` 的最后一个字节,则可以这样使用:
|
|
|
|
同样的,如果你的切片想要包含 `String` 的最后一个字节,则可以这样使用:
|
|
|
|
|
|
|
|
|
|
|
|
```rust
|
|
|
|
```rust
|
|
|
|
let s = String::from("hello");
|
|
|
|
let s = String::from("hello");
|
|
|
@ -86,7 +86,7 @@ let slice = &s[0..len];
|
|
|
|
let slice = &s[..];
|
|
|
|
let slice = &s[..];
|
|
|
|
```
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
> 在对字符串使用切片语法时需要格外小心,切片的索引必须落在字符之间的边界位置,也就是 UTF-8 字符的边界,例如中文在 UTF-8 中占用三个字节,下面的代码就会崩溃:
|
|
|
|
> 在对字符串使用切片语法时需要格外小心,切片的索引必须落在字符之间的边界位置,也就是 UTF-8 字符的边界,例如中文在 UTF-8 中占用三个字节,下面的代码就会崩溃:
|
|
|
|
>
|
|
|
|
>
|
|
|
|
> ```rust
|
|
|
|
> ```rust
|
|
|
|
> let s = "中国人";
|
|
|
|
> let s = "中国人";
|
|
|
@ -204,7 +204,7 @@ fn say_hello(s: &str) {
|
|
|
|
|
|
|
|
|
|
|
|
## 字符串索引
|
|
|
|
## 字符串索引
|
|
|
|
|
|
|
|
|
|
|
|
在其它语言中,使用索引的方式访问字符串的某个字符或者子串是很正常的行为,但是在 Rust 中就会报错:
|
|
|
|
在其它语言中,使用索引的方式访问字符串的某个字符或者子串是很正常的行为,但是在 Rust 中就会报错:
|
|
|
|
|
|
|
|
|
|
|
|
```rust
|
|
|
|
```rust
|
|
|
|
let s1 = String::from("hello");
|
|
|
|
let s1 = String::from("hello");
|
|
|
@ -493,11 +493,11 @@ fn main() {
|
|
|
|
string_clear = ""
|
|
|
|
string_clear = ""
|
|
|
|
```
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
#### 连接 (Catenate)
|
|
|
|
#### 连接 (Concatenate)
|
|
|
|
|
|
|
|
|
|
|
|
1、使用 `+` 或者 `+=` 连接字符串
|
|
|
|
1、使用 `+` 或者 `+=` 连接字符串
|
|
|
|
|
|
|
|
|
|
|
|
使用 `+` 或者 `+=` 连接字符串,要求右边的参数必须为字符串的切片引用(Slice)类型。其实当调用 `+` 的操作符时,相当于调用了 `std::string` 标准库中的 [`add()`](https://doc.rust-lang.org/std/string/struct.String.html#method.add) 方法,这里 `add()` 方法的第二个参数是一个引用的类型。因此我们在使用 `+`, 必须传递切片引用类型。不能直接传递 `String` 类型。**`+` 和 `+=` 都是返回一个新的字符串。所以变量声明可以不需要 `mut` 关键字修饰**。
|
|
|
|
使用 `+` 或者 `+=` 连接字符串,要求右边的参数必须为字符串的切片引用(Slice)类型。其实当调用 `+` 的操作符时,相当于调用了 `std::string` 标准库中的 [`add()`](https://doc.rust-lang.org/std/string/struct.String.html#method.add) 方法,这里 `add()` 方法的第二个参数是一个引用的类型。因此我们在使用 `+`, 必须传递切片引用类型。不能直接传递 `String` 类型。**`+` 和 `+=` 都是返回一个新的字符串。所以变量声明可以不需要 `mut` 关键字修饰**。
|
|
|
|
|
|
|
|
|
|
|
|
示例代码如下:
|
|
|
|
示例代码如下:
|
|
|
|
|
|
|
|
|
|
|
@ -607,7 +607,7 @@ fn main() {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
```
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
当然,在某些情况下,可能你会希望保持字符串的原样,不要转义:
|
|
|
|
当然,在某些情况下,可能你会希望保持字符串的原样,不要转义:
|
|
|
|
```rust
|
|
|
|
```rust
|
|
|
|
fn main() {
|
|
|
|
fn main() {
|
|
|
|
println!("{}", "hello \\x52\\x75\\x73\\x74");
|
|
|
|
println!("{}", "hello \\x52\\x75\\x73\\x74");
|
|
|
@ -675,7 +675,7 @@ for b in "中国人".bytes() {
|
|
|
|
想要准确的从 UTF-8 字符串中获取子串是较为复杂的事情,例如想要从 `holla中国人नमस्ते` 这种变长的字符串中取出某一个子串,使用标准库你是做不到的。
|
|
|
|
想要准确的从 UTF-8 字符串中获取子串是较为复杂的事情,例如想要从 `holla中国人नमस्ते` 这种变长的字符串中取出某一个子串,使用标准库你是做不到的。
|
|
|
|
你需要在 `crates.io` 上搜索 `utf8` 来寻找想要的功能。
|
|
|
|
你需要在 `crates.io` 上搜索 `utf8` 来寻找想要的功能。
|
|
|
|
|
|
|
|
|
|
|
|
可以考虑尝试下这个库:[utf8_slice](https://crates.io/crates/utf8_slice)。
|
|
|
|
可以考虑尝试下这个库:[utf8_slice](https://crates.io/crates/utf8_slice)。
|
|
|
|
|
|
|
|
|
|
|
|
## 字符串深度剖析
|
|
|
|
## 字符串深度剖析
|
|
|
|
|
|
|
|
|
|
|
|