MST

星途 面试题库

面试题:Rust移动语义在函数参数传递中的应用

编写一个Rust函数`take_ownership`,它接受一个`String`类型的参数并在函数内部打印该字符串,函数结束后调用者不能再使用该字符串。然后编写另一个函数`modify_and_return`,它接受一个`String`参数,修改这个字符串(例如添加一个后缀),然后返回修改后的字符串。请解释这两个函数中移动语义是如何体现的,以及调用这两个函数时变量所有权的转移情况。
36.5万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试
fn take_ownership(s: String) {
    println!("{}", s);
}

fn modify_and_return(s: String) -> String {
    let new_s = s + " - modified";
    new_s
}

移动语义及所有权转移解释

  1. take_ownership函数
    • 当调用take_ownership函数并传入一个String类型的变量时,变量的所有权从调用者转移到了函数take_ownership中。
    • 这是因为String类型在Rust中是一个拥有堆上数据的类型,为了避免内存泄漏和确保内存安全,所有权会被转移。
    • 函数结束后,s变量在函数内部被销毁,调用者不能再使用原来传入的字符串变量,因为所有权已经转移且原变量已无效。
  2. modify_and_return函数
    • 同样,当调用modify_and_return函数并传入一个String类型的变量时,变量的所有权从调用者转移到了函数modify_and_return中。
    • 在函数内部,对传入的字符串进行修改并创建了一个新的字符串new_s
    • 函数返回new_s时,new_s的所有权被转移给了调用者。原传入的字符串变量在函数内部被消耗,调用者不能再使用原传入的变量,而是使用返回的新字符串。