MST

星途 面试题库

面试题:Rust中map链式调用与泛型及生命周期

编写一个泛型函数,该函数接受一个`&[T]`类型的切片,其中`T`实现了`Copy`和`Display` trait。函数需要使用`map`链式调用,将切片中的每个元素转换为字符串,然后拼接成一个以逗号分隔的字符串。此外,在函数签名中合理处理泛型类型`T`的生命周期,确保代码的正确性和高效性,并对可能出现的借用检查问题进行解释及解决。
30.6万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试
use std::fmt::Display;

fn join_comma<T: Copy + Display>(slice: &[T]) -> String {
    slice.iter()
         .map(|item| item.to_string())
         .collect::<Vec<String>>()
         .join(",")
}

借用检查问题解释及解决

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