Skip to content

所有权与函数

> 理解函数调用如何影响所有权:值传递会转移所有权,引用传递则只借用。

所有权与函数

获取所有权(Move)

rust
// 函数获取参数的所有权
fn take_ownership(s: String) {
    println!("拥有:{}", s);
}  // s 离开作用域,被 drop

fn main() {
    let s = String::from("hello");
    take_ownership(s);  // s 的所有权被移动

    // println!("{}", s);  // ❌ 错误!s 已无效
}
▶ Run

借用(Borrow)

rust
// 借用参数,不获取所有权
fn borrow_string(s: &String) {
    println!("借用:{}", s);
}  // s 只是引用,不会 drop

fn main() {
    let s = String::from("hello");
    borrow_string(&s);  // 传递引用

    println!("仍可使用:{}", s);  // ✅ s 仍然有效
}
▶ Run

借用 &str(推荐)

rust
// 最佳实践:接受 &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
}
▶ Run

返回所有权

rust
// 返回 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());
}
▶ Run

小结

  • 将值传入函数会转移所有权(Move),调用后原变量不可再用
  • 传递引用(&T)只借用,不转移所有权
  • 函数返回值可以将所有权转移给调用方
  • 理解函数调用的所有权变化是掌握 Rust 的关键一步

练习题

详见:练习题