Rust中&str和String的区别与转换

Rust中 &str 和 String 有和区别?如何转换?


在Rust中,字符串主要有两种类型:&strString

  1. &str:在Rust中称为字符串切片(string slice)。它是对一段内存的引用,这段内存包含了一个有效的UTF-8字符串。字符串切片是不可变的,也就是说你不能修改它们包含的字符串。字符串切片通常用于函数参数,表示函数可以接受任何类型的字符串。

&str是对现有字符串的引用,不论这个字符串是String还是字符串字面量

  1. String:这是一个在堆上分配的、可增长的、UTF-8编码的字符串类型。String类型的字符串可以被修改,比如添加新的字符或者删除已有的字符。

在用法上,&strString有一些重要的区别。对于String类型的字符串,你可以改变它的内容和长度。但对于&str类型的字符串切片,你只能读取它,不能改变它。

在Rust中,你可以使用多种方式在&strString之间进行转换:

  • 你可以使用&运算符将String转换为&str。例如:

    1
    2
    let s: String = "hello".to_string();
    let t: &str = &s;
  • 你可以使用to_string方法或者String::from函数将&str转换为String。例如:

    1
    2
    3
    4
    let s: &str = "hello";
    let t: String = s.to_string();
    // 或者
    let u: String = String::from(s);

请注意,虽然这两种类型都用于处理字符串,但它们在内存管理和功能上有重要的区别,所以在编写Rust代码时,你需要根据具体的需求来选择使用哪一种类型。


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
fn main() {

// &str
// 纯粹的一个字符串,是&str类型,可以认为就是 字符串字面量。即 字符串切片(string slice)类型
// 可以使用&运算符将String转换为&str (见最下面)
let str_literal: &str = "cuishuang";



// String
// 可以使用to_string方法或者String::from函数将&str转换为String

// 可以通过 String::from(字符串字面量)得来
let str_object1 = String::from("Hello");

let str_object2 = String::from(str_literal);
// 或者 字符串字面量.to_string()方式得来
let str_object3 =str_literal.to_string();

let str_literal1 = &str_object1;
let str_literal2 = &str_object2;
let str_literal3 = &str_object3;

println!("第一个str_object1值为:{},第二个为:{},第三个为:{}",str_object1,str_object2,str_object3);

println!();

println!("第一个str_literal1值为:{},第二个为:{},第三个为:{}",str_literal1,str_literal2,str_literal3);

}
1
2
3
第一个str_object1值为:Hello,第二个为:cuishuang,第三个为:cuishuang

第一个str_literal1值为:Hello,第二个为:cuishuang,第三个为:cuishuang

&str和String能否进行迭代?会得到什么


在 Rust 中,&strString 都可以进行迭代操作。它们都实现了 Iterator trait,因此可以使用迭代器方法进行遍历和处理字符串的每个字符。

当你迭代一个 &strString 对象时,你会得到一个迭代器,它会产生字符串中的每个字符作为迭代序列的一部分。迭代器提供了一系列方法,如 mapfiltercollect 等,可以在迭代过程中对字符进行处理和转换。

以下是一个示例,演示了如何迭代 &strString

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
fn main() {

println!("下面迭代&str");
// 迭代 &str
let text = "Hello";
for ch in text.chars() {
println!("{}", ch);
}


println!("下面迭代String");
// 迭代 String
let s = String::from("World");
for ch in s.chars() {
println!("{}", ch);
}

}

在上面的示例中,我们使用 chars() 方法获取一个迭代器,然后使用 for 循环遍历每个字符,并打印出字符。

对于 &strString 的迭代,得到的是字符,而不是字节。如果你需要以字节为单位进行迭代,可以使用 bytes() 方法来替代 chars() 方法。

需要注意的是,迭代字符串时,字符的处理可能会受到 Unicode 编码和字符集的影响。因此,如果你需要处理复杂的字符操作,如字符的宽度、组合、分割等,建议使用 Rust 的 Unicode 相关库,如 unicode-segmentationunicode-width 等,以确保正确处理字符的特殊情况。


1
2
3
4
5
6
7
8
9
10
11
12
下面迭代&str
H
e
l
l
o
下面迭代String
W
o
r
l
d

迭代字节:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
fn main() {

println!("下面迭代&str");
// 迭代 &str
let text = "Hello";
for ch in text.bytes() {
println!("{}", ch);
}


println!("下面迭代String");
// 迭代 String
let s = String::from("World");
for ch in s.bytes() {
println!("{}", ch);
}

}

输出:

1
2
3
4
5
6
7
8
9
10
11
12
下面迭代&str
72
101
108
108
111
下面迭代String
87
111
114
108
100

提供run和debug功能的是rust-anlyler这个插件,而不是什么code-runner