面试题答案
一键面试fn concatenate_strings(s1: &str, s2: &str) -> String {
s1.to_owned() + s2
}
生命周期标注说明
- 不需要显式生命周期标注:在这个函数中,返回值类型是
String
,而不是&str
。String
是一个拥有所有权的值,它的生命周期与函数调用所在的作用域相关,而不是依赖于输入的&str
切片的生命周期。因此,不需要进行显式的生命周期标注,Rust编译器能够自动推断出正确的生命周期关系。 - 如果返回
&str
的情况:如果函数要返回&str
,则需要显式标注生命周期。例如:
fn concatenate_strings<'a>(s1: &'a str, s2: &'a str) -> &'a str {
// 以下代码无法直接实现,因为无法在栈上创建一个新的`&str`包含拼接内容
// 仅为了展示生命周期标注
todo!()
}
在这种情况下,标注<'a>
表示两个输入切片s1
和s2
以及返回的切片都具有相同的生命周期'a
。
性能提升点
- 使用
String::with_capacity
:可以预先计算拼接后字符串的长度,使用with_capacity
方法初始化一个具有足够容量的String
,以减少重新分配内存的次数。
fn concatenate_strings(s1: &str, s2: &str) -> String {
let mut result = String::with_capacity(s1.len() + s2.len());
result.push_str(s1);
result.push_str(s2);
result
}
- 避免不必要的复制:由于
+
操作符会将&str
转换为String
,在性能敏感的场景下,如果可以直接操作&str
,尽量避免这种转换。但在本题要求拼接返回新字符串的情况下,使用push_str
方法可以直接操作&str
,相对+
操作符减少了一次不必要的String
转换。