所有权与函数
> 理解函数调用如何影响所有权:值传递会转移所有权,引用传递则只借用。
所有权与函数
获取所有权(Move)
rust
▶ Run// 函数获取参数的所有权
fn take_ownership(s: String) {
println!("拥有:{}", s);
} // s 离开作用域,被 drop
fn main() {
let s = String::from("hello");
take_ownership(s); // s 的所有权被移动
// println!("{}", s); // ❌ 错误!s 已无效
}借用(Borrow)
rust
▶ Run// 借用参数,不获取所有权
fn borrow_string(s: &String) {
println!("借用:{}", s);
} // s 只是引用,不会 drop
fn main() {
let s = String::from("hello");
borrow_string(&s); // 传递引用
println!("仍可使用:{}", s); // ✅ s 仍然有效
}借用 &str(推荐)
rust
▶ Run// 最佳实践:接受 &str 而不是 &String
fn print_str(s: &str) {
println!("收到:{}", s);
}
fn main() {
let string = String::from("hello");
let str_literal = "world";
// &str 可以接受多种类型
print_str(&string); // &String → &str(自动解引用)
print_str(str_literal); // &str 直接传递
print_str("literal"); // &'static str
}返回所有权
rust
▶ Run// 返回 String(转移所有权给调用者)
fn create_greeting(name: &str) -> String {
format!("Hello, {}!", name)
} // 创建的 String 被返回,不会 drop
fn main() {
let greeting = create_greeting("Alice");
println!("{}", greeting); // greeting 现在属于 main
// 函数返回后仍可使用
println!("长度:{}", greeting.len());
}小结
- 将值传入函数会转移所有权(Move),调用后原变量不可再用
- 传递引用(
&T)只借用,不转移所有权 - 函数返回值可以将所有权转移给调用方
- 理解函数调用的所有权变化是掌握 Rust 的关键一步
练习题
详见:练习题