面试题答案
一键面试use std::fmt::Display;
fn join_comma<T: Copy + Display>(slice: &[T]) -> String {
slice.iter()
.map(|item| item.to_string())
.collect::<Vec<String>>()
.join(",")
}
借用检查问题解释及解决
- 借用检查问题:
map
方法返回一个迭代器,在使用collect
收集结果之前,迭代器会在内存中存在。如果没有正确处理生命周期,编译器可能会报错,例如,迭代器可能会试图借用超出其作用域的数据。 - 解决办法:在函数签名中使用
&[T]
,这表明函数接受的切片的生命周期是由调用者管理的。map
调用中,item
是&T
类型,通过to_string
方法将其转换为拥有所有权的String
类型,这样在collect
收集时,就不会存在借用生命周期的问题。由于T
实现了Copy
trait,在迭代过程中对item
的操作不会影响原切片的数据,确保了代码的正确性和高效性。