MST

星途 面试题库

面试题:Rust函数返回复杂类型及处理逻辑

编写一个Rust函数,该函数接受一个字符串切片`&str`作为参数。如果字符串长度大于5,返回这个字符串的前5个字符组成的新字符串;否则,返回原字符串。这里需要处理可能出现的`String`和`&str`类型转换问题,并详细说明在这种场景下不同返回值类型(`String`与`&str`)的选择对性能和内存管理的影响。
46.0万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试
fn process_string(s: &str) -> String {
    if s.len() > 5 {
        s[..5].to_string()
    } else {
        s.to_string()
    }
}

返回值类型选择对性能和内存管理的影响

  1. 返回 String类型
    • 性能:无论字符串长度如何,都需要创建一个新的String实例。这涉及到内存分配和数据复制。如果原字符串长度小于等于5,复制的开销相对较小;但如果原字符串长度远大于5,复制前5个字符到新的String会有一定的性能开销。
    • 内存管理String拥有自己的堆内存,在函数返回后,调用者负责管理这个新分配的内存。当String离开作用域时,其占用的堆内存会被释放。
  2. 返回 &str类型
    • 性能:如果原字符串长度小于等于5,可以直接返回原字符串切片,没有额外的内存分配和数据复制开销,性能较好。但如果原字符串长度大于5,要返回前5个字符组成的切片,需要在函数内部创建一个新的String并将前5个字符复制进去,然后再返回其切片,这样就增加了不必要的开销(因为&str本身不能拥有独立的内存,需要依赖String等拥有堆内存的类型)。
    • 内存管理&str是一个借用类型,它不拥有内存。如果返回&str,调用者必须确保借用的字符串(原字符串或者其一部分)在&str的生命周期内一直有效。如果不小心让原字符串提前释放,会导致悬垂指针问题。所以在这个场景下,返回&str会增加代码复杂性和出错风险,而返回String更简单直接,虽然有一定的性能开销,但在内存管理上更安全。