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

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

问题描述:

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

我发现的唯一信息(因为在Google上搜索符号效果不佳)是this page on Rust By Example,但它不能解释两者之间的区别。 The Book没有太多的信息,ref仅在Patterns一章中列出。但是,ref似乎也在这种情况下使用。

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

+0

*非常相关,但不完全重复,因为它不是'ref'和'&'之间的比较:http://*.com/questions/27911656/rust-by-example-the-ref-模式 – Kroltan

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; 

这里,既deref1deref2i32类型。

但是,并不总是可以用两种方式编写相同的表达式,如下所示。例如,您不能使用&来引用存储在枚举变体中的值:您需要匹配它。例如,如果你想利用在Some的价值基准,你需要写:

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

因为有鲁斯特没有办法,你可以使用&运营商,否则访问值。

+0

谢谢,像fn blah(ref a:i32){}'这样的定义相当于'fn blah(a:&i32)',它们何时都可以表达? – Kroltan

+4

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

+0

@ huon-dbaupp,这是否意味着ref变体会先复制/移动该值? – Kroltan