fn take_ownership(s: String) {
println!("{}", s);
}
fn modify_and_return(s: String) -> String {
let new_s = s + " - modified";
new_s
}
移动语义及所有权转移解释
take_ownership
函数:
- 当调用
take_ownership
函数并传入一个String
类型的变量时,变量的所有权从调用者转移到了函数take_ownership
中。
- 这是因为
String
类型在Rust中是一个拥有堆上数据的类型,为了避免内存泄漏和确保内存安全,所有权会被转移。
- 函数结束后,
s
变量在函数内部被销毁,调用者不能再使用原来传入的字符串变量,因为所有权已经转移且原变量已无效。
modify_and_return
函数:
- 同样,当调用
modify_and_return
函数并传入一个String
类型的变量时,变量的所有权从调用者转移到了函数modify_and_return
中。
- 在函数内部,对传入的字符串进行修改并创建了一个新的字符串
new_s
。
- 函数返回
new_s
时,new_s
的所有权被转移给了调用者。原传入的字符串变量在函数内部被消耗,调用者不能再使用原传入的变量,而是使用返回的新字符串。