`&`和`ref`有什么区别?

时间:2015-10-18 23:25:05

标签: reference rust

我理解&的工作原理,但它与ref之间的区别是什么?它们可以互换吗?

我找到的唯一信息(因为在Google上搜索符号效果不佳)是this page on Rust By Example,但它并没有解释两者之间的区别。 The Book信息量不大,ref只列在Patterns章节。但似乎ref也在该上下文之外使用。

那么,ref的用途是什么,与&的区别是什么?

1 个答案:

答案 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;

此处,deref1deref2的类型均为i32

然而,并不总是能够以两种方式编写相同的表达式,如此处所示。例如,您不能使用&来引用存储在枚举变体中的值:您需要匹配它。例如,如果要引用Some中的值,则需要编写:

match option {
    Some(ref value) => { /* stuff */ }
    None => { /* stuff */ }
}

因为在Rust中无法使用&运算符来访问该值。