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

标签 rust reference borrow-checker ownership borrowing

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

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

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

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

最佳答案

If you have a reference to a struct with methods, is the syntax for using those methods exactly the same as it would be if you were dealing with an owned variable? Are there any other difference between how one would use an owned variable, and how one would use a reference to that variable?

是的,除非你有一个不可变引用,否则你只能调用采用不可变引用的方法,如果你有一个可变引用,你可以调用采用可变或不可变引用的方法,如果你有所有权,你可以调用任何方法,包括那些拥有所有权的方法。示例:

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
}

When do you need to dereference a reference variable?

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

关于rust - 在 Rust 中使用引用和使用拥有的值有区别吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65777741/

相关文章:

rust - 从对象池中借用时解决省略的静态生命周期

c++ - 正在初始化类型为 "int &"的引用(不是 const 限定的),其值是 "bool"类型的一些 hack?

rust - Rust-从 `&str`转换为 `String`,然后使用闭包转换

rust - 如何将动态值传递到 WGPU 顶点着色器?

rust - 变量在 map 中的生命周期不够长

rust - ** node.borrow()有什么作用?

python - 通过字典键进行动态操作

.net - 使程序集显示在“添加引用”的 .NET 选项卡中

loops - 是否可以编写一个调用 BufRead::fill_buf 的函数,直到中断错误不再发生而不使用 unsafe?

rust - 为什么借用检查器不明白借用切片的不同部分从根本上是可以的?