MST

星途 面试题库

面试题:Rust函数参数默认引用行为基础

在Rust中,描述函数参数默认引用行为的规则是什么?请举例说明函数在接收普通变量和引用变量作为参数时,其行为的差异。
18.4万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试

在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仍然可以在其作用域内正常使用。

总结来说,普通变量作为参数传递时,所有权被转移;引用变量作为参数传递时,仅借用数据,不转移所有权,这样可以在不转移所有权的情况下访问数据,有助于避免不必要的数据复制和管理所有权转移带来的复杂性。