面试题答案
一键面试在Rust中,函数参数默认不会获取传入值的引用,而是采用移动(move)语义,除非参数类型被声明为引用类型。
普通变量作为参数
fn take_ownership(v: Vec<i32>) {
println!("Got ownership of vec: {:?}", v);
}
fn main() {
let v = vec![1, 2, 3];
take_ownership(v);
// 这里再使用v会报错,因为v的所有权已经被移动到take_ownership函数中
// println!("v is: {:?}", v);
}
在这个例子中,take_ownership
函数接收一个Vec<i32>
类型的普通变量v
,函数获得了v
的所有权,在函数调用结束后,原变量v
在其作用域内不可用。
引用变量作为参数
fn print_vec_ref(v: &Vec<i32>) {
println!("Printing vec through reference: {:?}", v);
}
fn main() {
let v = vec![1, 2, 3];
print_vec_ref(&v);
// 这里可以继续使用v,因为只是传递了v的引用,所有权没有发生转移
println!("v is: {:?}", v);
}
在这个例子中,print_vec_ref
函数接收一个&Vec<i32>
类型的引用参数v
,函数通过引用访问原Vec
,而不会获取其所有权。函数调用结束后,原变量v
仍然可以在其作用域内正常使用。
总结来说,普通变量作为参数传递时,所有权被转移;引用变量作为参数传递时,仅借用数据,不转移所有权,这样可以在不转移所有权的情况下访问数据,有助于避免不必要的数据复制和管理所有权转移带来的复杂性。