[英]What's the difference between `&` and `ref`?
我理解&
工作方式,但是和ref
之间有什么区别? 它们可以互换吗?
我发现的唯一信息(因为在Google上搜索符号效果不佳)是Rust By Example上的这个页面 ,但它没有解释这两者之间的区别。 本书的信息量不大,而ref
仅列在“ 模式”一章中。 但似乎ref
也在该上下文之外使用。
那么, ref
的用途是什么,和&
什么区别?
ref
在模式中用于绑定对左值的引用(左值是一个值,您可以使用或多或少的地址)。
重要的是要理解模式从正常表达式“向后”,因为它们用于解构价值。
这是一个简单的例子。 假设我们有这个:
let value = 42;
我们可以通过两种方式绑定对value
的引用:
let reference1 = &value;
let ref reference2 = value;
在第一种情况下,我们使用&
作为运算符来获取value
的地址。 在第二种情况下,我们使用ref
模式来“解构”左值。 在这两种情况下,变量的类型都是&i32
。
&
也可以在模式中使用,但它恰恰相反:它通过解除引用来解构引用。 假设我们有:
let value = 42;
let reference = &value;
我们可以通过两种方式取消引用reference
:
let deref1 = *reference;
let &deref2 = reference;
这里, deref1
和deref2
的类型都是i32
。
但是,并不总是可以通过两种方式编写相同的表达式,如此处所示。 例如,您不能使用&
来引用存储在枚举变体中的值:您需要匹配它。 例如,如果要引用Some
的值,则需要编写:
match option {
Some(ref value) => { /* stuff */ }
None => { /* stuff */ }
}
因为在Rust中没有办法,你可以使用&
运算符来访问该值。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.