面试题答案
一键面试// 定义函数,参数为两个字符串切片引用,返回拼接后的新字符串
fn concat_slices<'a, 'b>(slice1: &'a str, slice2: &'b str) -> String {
// 使用 format! 宏进行字符串拼接
format!("{}{}", slice1, slice2)
}
变量生命周期和借用规则解释
- 变量生命周期:在 Rust 中,每个引用都有一个生命周期,它描述了引用保持有效的时间段。在这个函数中,
slice1
和slice2
是两个字符串切片引用,它们的生命周期分别由'a
和'b
标注。 - 借用规则:
- 同一时间,对同一数据,只能有一个可变引用,或者多个不可变引用(即“一写多读”原则)。在函数
concat_slices
中,slice1
和slice2
都是不可变引用,符合该规则。 - 引用的生命周期必须足够长,以保证在使用引用的代码块结束之前,被引用的数据不会被释放。
- 同一时间,对同一数据,只能有一个可变引用,或者多个不可变引用(即“一写多读”原则)。在函数
生命周期标注确保代码正确编译
- 显式生命周期标注:函数签名中的
<'a, 'b>
是显式的生命周期参数标注。这告诉编译器,slice1
的生命周期是'a
,slice2
的生命周期是'b
。 - 返回值的生命周期:函数返回的是一个
String
类型,它拥有自己的数据,不依赖于输入的字符串切片引用的生命周期。所以这里不需要在返回值类型上标注生命周期。如果返回的是一个字符串切片,就需要考虑如何关联返回值的生命周期与输入参数的生命周期,以确保返回的切片在其使用范围内是有效的。例如,如果要返回其中一个切片,可能需要写成fn return_slice<'a>(slice1: &'a str, slice2: &str) -> &'a str { slice1 }
,这样保证返回的切片slice1
在其生命周期'a
内是有效的。
在上述 concat_slices
函数中,由于返回的 String
是新分配的内存,不依赖于输入切片的生命周期,所以编译器能够正确理解并编译代码。