面试题答案
一键面试fn process_data<'a, 'b>(a: &'a str, b: &'b str) -> String {
if std::mem::size_of_val(a) > std::mem::size_of_val(b) {
format!("{}{}", a, b)
} else {
format!("{}{}", b, a)
}
}
解释
-
所有权转移:
- 函数
process_data
接收两个字符串切片引用&'a str
和&'b str
,这意味着函数并不获取输入字符串的所有权,而是借用它们。 - 函数返回一个
String
类型的值,这是一个拥有所有权的字符串。所以所有权是从函数外部转移到函数内部,并最终返回给调用者。
- 函数
-
引用:
- 使用
&'a str
和&'b str
作为参数类型,表明函数接收的是对字符串的不可变引用。这是因为字符串切片str
本身是不可变的,并且在Rust中,默认的引用是不可变的。 - 这种引用方式使得函数可以在不获取所有权的情况下操作字符串数据,提高了效率和安全性。
- 使用
-
生命周期标注:
- 函数定义为
fn process_data<'a, 'b>(a: &'a str, b: &'b str) -> String
,这里明确标注了两个生命周期参数'a
和'b
。这两个生命周期参数分别与两个输入字符串切片的生命周期相关联。 - 这里并没有直接按照题目中 “如果
'a
生命周期长于'b
,返回的字符串生命周期与'b
相同,反之亦然” 的规则来标注返回值的生命周期,因为返回值是String
类型,它拥有自己的独立生命周期,不依赖于输入切片的生命周期。String
类型在堆上分配内存,其生命周期由其自身的内存管理机制决定,只要它在作用域内没有被释放,就会一直存在。在实际应用中,如果要严格按照题目规则,并且返回的是切片类型,可以通过更复杂的生命周期关联来实现,但这里返回String
简化了生命周期管理。
- 函数定义为