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

Kro*_*tan 11 reference rust

我理解它是如何&工作的,但是它和它有ref什么区别?它们可以互换吗?

我发现的唯一信息(因为在Google上搜索符号效果不佳)是Rust By Example上的这个页面,但它没有解释这两者之间的区别.本书的信息量不大,ref仅列在" 模式"一章中.但它似乎ref也在该背景之外使用.

那么,有什么用途ref,有什么区别&

Fra*_*gné 12

ref在模式中用于绑定对左值的引用(左值是一个值,您可以使用或多或少的地址).

重要的是要理解模式从正常表达式"向后",因为它们用于解构价值.

这是一个简单的例子.假设我们有这个:

let value = 42;
Run Code Online (Sandbox Code Playgroud)

我们可以通过value两种方式绑定引用:

let reference1 = &value;
let ref reference2 = value;
Run Code Online (Sandbox Code Playgroud)

在第一种情况下,我们使用&运算符来获取地址value.在第二种情况下,我们使用ref模式来"解构"左值.在这两种情况下,变量的类型都是&i32.

&也可以在模式中使用,但它恰恰相反:它通过解除引用来解构引用.假设我们有:

let value = 42;
let reference = &value;
Run Code Online (Sandbox Code Playgroud)

我们可以reference通过两种方式取消引用:

let deref1 = *reference;
let &deref2 = reference;
Run Code Online (Sandbox Code Playgroud)

在这里,两者的类型deref1deref2i32.

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

match option {
    Some(ref value) => { /* stuff */ }
    None => { /* stuff */ }
}
Run Code Online (Sandbox Code Playgroud)

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

  • @Kroltan不,他们不相同.函数参数中的模式(即`:`左边的任何东西)纯粹是一个实现细节,调用者只能看到类型(即`:`右边的东西).第一种情况相当于`fn blah(tmp:i32){let ref a = tmp; ......}` 第一个被称为`blah(0)`而第二个被称为'blah(&1)`.当然,函数本身,`a`的类型在两种情况下都是`&i32`,它只是外部接口的不同. (4认同)
  • `fn blah(ref a:i32) - > {}`大致相当于`fn blah(temp_a:i32){let ref a = temp_a; }`. (2认同)