【问题标题】:Is there a difference between using a reference, and using an owned value in Rust?在 Rust 中使用引用和使用拥有值之间有区别吗?
【发布时间】:2021-04-22 22:34:47
【问题描述】:
我正在阅读 Rust 书。它解释说,当你创建一个函数时,你需要决定你的函数是否将拥有它的参数,或者将它们作为一个可变或不可变的引用。
我不完全清楚的是,在该函数中使用自有值或使用引用之间是否存在语法差异。
如果你引用了带有方法的结构,那么使用这些方法的语法是否与处理拥有变量时的语法完全相同?在如何使用拥有的变量和如何使用对该变量的引用之间还有其他区别吗?
什么时候需要取消引用引用变量?我只在您尝试增加由对 int 的可变引用或类似内容指向的变量存储的值时才看到取消引用。如果您打算用新的东西完全替换变量的值,似乎只需要取消引用它。例如,如果要对结构的引用运行方法,则不需要取消引用,但如果要将值替换为该结构的完全不同的实例,则需要取消引用。对吗?
【问题讨论】:
标签:
rust
reference
borrow-checker
ownership
borrowing
【解决方案1】:
如果你引用了带有方法的结构,那么使用这些方法的语法是否与处理拥有变量时的语法完全相同?在如何使用拥有的变量和如何使用对该变量的引用之间还有其他区别吗?
是的,除非您有不可变引用,否则您只能调用采用不可变引用的方法,如果您有可变引用,则可以调用采用可变或不可变引用的方法,如果您拥有所有权,则可以调用任何方法,包括那些取得所有权的方法。示例:
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 代码中使用引用操作符,因为它很少显式需要。