在 Rust 中使用引用和使用拥有的值有区别吗?

问题描述

我正在阅读 Rust 的书。它解释说,当您创建一个函数时,您需要决定您的函数是否将拥有其参数的所有权,或者将它们作为可变或不可变引用。

我不完全清楚的是,在该函数中使用自有值与使用引用之间是否存在语法差异。

如果您有一个对带有方法的结构体的引用,那么使用这些方法的语法是否与您处理拥有的变量时的语法完全相同?使用自有变量的方式与使用该变量的引用方式之间是否还有其他区别?

什么时候需要取消引用引用变量?我只在您尝试增加由对 int 的可变引用或类似内容的可变引用所指向的变量存储的值时才看到取消引用。如果您打算用新的东西完全替换变量的值,似乎您只需要取消引用它。例如,如果要对结构的引用运行方法,则不需要取消引用,但如果要使用该结构的完全不同的实例替换该值,则需要取消引用。是吗?

解决方法

如果您有一个对带有方法的结构体的引用,那么使用这些方法的语法是否与您处理拥有的变量时的语法完全相同?使用自有变量的方式与使用该变量的引用方式之间是否还有其他区别?

是的,除非你有一个不可变的引用,你被限制只能调用接受不可变引用的方法,如果你有一个可变引用,你可以调用接受可变或不可变引用的方法,如果你有所有权,你可以调用任何方法,包括取得所有权的方法。示例:

struct Struct;

impl Struct {
    fn takes_self_ref(&self) {}
    fn takes_self_mut_ref(&mut self) {}
    fn takes_self(self) {}
}

fn func_owned(mut s: Struct) {
    s.takes_self_ref(); // compiles
    s.takes_self_mut_ref(); // compiles
    s.takes_self(); // compiles
}

fn func_mut_ref(s: &mut Struct) {
    s.takes_self_ref(); // compiles
    s.takes_self_mut_ref(); // compiles
    s.takes_self(); // error
}

fn func_ref(s: &Struct) {
    s.takes_self_ref(); // compiles
    s.takes_self_mut_ref(); // error
    s.takes_self(); // error
}

什么时候需要取消引用引用变量?

引用操作符 *,但是引用会在方法调用时被编译器自动取消引用,这就是为什么您在实践中很少看到 Rust 代码中使用引用操作符的原因,因为它很少被明确需要。