在 Rust 中使用引用和使用自有值之间有区别吗?
Is there a difference between using a reference, and using an owned value in Rust?
我正在阅读 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 这本书。它解释说,当您创建一个函数时,您需要决定您的函数是否将获得其参数的所有权,或者将它们作为可变或不可变引用。
我不完全清楚的是,在该函数中使用自有值或使用引用之间是否存在句法差异。
如果您引用了带有方法的结构,那么使用这些方法的语法是否与处理自有变量时的语法完全相同?如何使用拥有的变量与如何使用对该变量的引用之间是否还有其他区别?
什么时候需要解除对引用变量的引用?当您尝试增加由对 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 代码中使用引用运算符,因为它很少明确需要。