我理解&
的工作原理,但它与ref
之间的区别是什么?它们可以互换吗?
我找到的唯一信息(因为在Google上搜索符号效果不佳)是this page on Rust By Example,但它并没有解释两者之间的区别。 The Book信息量不大,ref
只列在Patterns章节。但似乎ref
也在该上下文之外使用。
那么,ref
的用途是什么,与&
的区别是什么?
答案 0 :(得分:12)
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中无法使用&
运算符来访问该值。