🦀 Rust 字符串类型快问快答

测试你对Rust字符串处理的理解程度

10
题目数量
20
预计时间(分钟)
⭐⭐⭐⭐
难度等级
第1题 (判断题)
在Rust中,String和&str都是UTF-8编码的字符串类型。
正确
错误

答案解析:

答案:正确

String和&str都是UTF-8编码的字符串类型。

String是拥有所有权的可变字符串,存储在堆上。

&str是字符串切片,通常是对String或字符串字面量的借用。

两者都保证内容是有效的UTF-8序列。

第2题 (选择题)
下列哪种方式可以将&str转换为String?
s.to_string()
String::from(s)
s.into()
以上都可以

答案解析:

答案:以上都可以

s.to_string() - 调用ToString trait的方法

String::from(s) - 使用From trait的实现

s.into() - 使用Into trait的实现

还有s.to_owned()也可以实现相同效果。

第3题 (选择题)
字符串字面量的类型是什么?
String
&'static str
&str
str

答案解析:

答案:&'static str

字符串字面量如"hello"的类型是&'static str。

'static生命周期表示这些字符串在程序的整个运行期间都有效。

它们被硬编码到程序的二进制文件中。

&str是字符串切片的一般形式,而&'static str是特定生命周期的字符串切片。

第4题 (判断题)
String类型可以直接修改其中的字符,而&str不可以。
正确
错误

答案解析:

答案:错误

String类型也不能直接修改其中的字符。

Rust中的字符串不支持索引修改,因为UTF-8编码的复杂性。

要修改String,需要使用push()、push_str()、insert()等方法。

或者使用replace()、chars().collect()等方法重新构建字符串。

第5题 (选择题)
以下代码的输出是什么?
let s = "hello"; println!("{}", s.len());
5
4
编译错误
运行时错误

答案解析:

答案:5

len()方法返回字符串的字节长度,不是字符数量。

"hello"包含5个ASCII字符,每个字符占1个字节,所以长度是5。

如果字符串包含非ASCII字符,字节长度可能大于字符数量。

要获取字符数量,应该使用chars().count()。

第6题 (选择题)
下列哪个方法可以向String末尾添加字符串?
push()
push_str()
append()
concat()

答案解析:

答案:push_str()

push_str()方法用于向String末尾添加字符串切片。

push()方法用于添加单个字符,不是字符串。

Rust中没有append()方法用于字符串操作。

concat()是用于连接字符串数组的函数,不是String的方法。

第7题 (判断题)
可以使用索引语法(如s[0])来访问字符串中的字符。
正确
错误

答案解析:

答案:错误

Rust不支持字符串的索引访问,因为UTF-8编码的复杂性。

一个字符可能占用1-4个字节,索引访问可能返回无效的字节序列。

要访问字符,应该使用chars()迭代器或字节切片。

例如:s.chars().nth(0)或&s[0..1](需要确保边界安全)。

第8题 (简答题)
String和&str在内存存储上有什么区别?

答案解析:

答案:String存储在堆上,&str通常指向栈或静态内存

String是拥有所有权的类型,数据存储在堆上,包含指针、长度和容量。

&str是字符串切片,是一个胖指针,包含指向数据的指针和长度。

&str可以指向堆上的String数据、栈上的数组或静态内存中的字符串字面量。

String可以增长和收缩,而&str是不可变的视图。

第9题 (选择题)
以下哪种方式可以创建一个空的String?
String::new()
String::from("")
"".to_string()
以上都可以

答案解析:

答案:以上都可以

String::new() - 创建一个新的空String

String::from("") - 从空字符串字面量创建String

"".to_string() - 将空字符串字面量转换为String

还可以使用String::with_capacity(0)创建指定容量的空String。

第10题 (简答题)
什么是字符串切片?它与完整字符串有什么关系?

答案解析:

答案:字符串切片是对字符串部分内容的引用

字符串切片(&str)是对字符串中连续字节序列的引用。

它不拥有数据,只是指向原始字符串的某个部分。

可以通过范围语法创建:&s[start..end]。

切片必须在有效的字符边界上,否则会panic。

字符串字面量本身就是字符串切片(&'static str)。

🎉
恭喜完成测验!
10/10
你对Rust字符串类型的掌握非常出色!