【问题标题】:What's the difference between `&` and `ref`?`&` 和 `ref` 有什么区别?
【发布时间】:2015-10-18 23:25:05
【问题描述】:

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

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

那么,ref 有什么用,和& 有什么区别?

【问题讨论】:

标签: reference rust


【解决方案1】:

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 中没有办法,您可以使用 & 运算符来访问该值。

【讨论】:

  • 谢谢,所以像fn blah(ref a: i32) {} 这样的定义等价于fn blah(a: &i32),什么时候都可以表达?
  • @Kroltan 不,它们不相等。函数参数中的模式(即: 左侧的任何东西)纯粹是一个实现细节,调用者只能看到类型(即: 右侧的东西)。第一种情况等价于fn blah(tmp: i32) { let ref a = tmp; ... }。第一个被称为blah(0),而第二个被称为blah(&1)。当然,函数本身,a的类型在这两种情况下都是&i32,只是对外接口不同而已。
  • @huon-dbaupp,这是否意味着 ref 变体将首先复制/移动值?
  • fn blah(ref a: i32) -> {} 大致相当于fn blah(temp_a: i32) { let ref a = temp_a; }
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-28
  • 1970-01-01
  • 2013-05-04
  • 2019-12-23
相关资源
最近更新 更多