结论:移动是所有权的转移——赋值、传参后原变量失效;借用是创建指向值的引用(&T 或 &mut T),所有权留在原处,引用离开作用域后原变量照常使用。
展开:选择依据是"谁负责释放"。移动适合所有权确实要交接的场景(如把 String 存进结构体);借用适合只读访问或临时修改,避免不必要的所有权来回传递和克隆开销。约束:借用必须遵守借用规则——任一时刻要么多个 &T,要么一个 &mut T;且引用不能比被借用的值活得更久。
fn len(s: &String) -> usize { s.len() } // 借用:不取所有权
fn main() {
let s = String::from("abc");
let n = len(&s); // 传引用
println!("{s} {n}"); // s 仍可用;若 len 收 String 则 s 已被移动
}
追问方向:什么时候必须移动(跨线程交给别的线程、存入集合)、重借(reborrow)&*p 的作用。