`&`和`ref`有什么区别?
我明白&
是如何工作的,但是与ref
有什么区别?它们可以互换吗?`&`和`ref`有什么区别?
我发现的唯一信息(因为在Google上搜索符号效果不佳)是this page on Rust By Example,但它不能解释两者之间的区别。 The Book没有太多的信息,ref
仅在Patterns一章中列出。但是,ref
似乎也在这种情况下使用。
那么,ref
有什么用,和&
有什么区别?
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 */ }
}
因为有鲁斯特没有办法,你可以使用&
运营商,否则访问值。
谢谢,像fn blah(ref a:i32){}'这样的定义相当于'fn blah(a:&i32)',它们何时都可以表达? – Kroltan
@Kroltan不,他们不相同。函数参数中的模式(即':'左边的任何东西)纯粹是一个实现细节,调用者只能看到类型(即':'右边的东西)。第一种情况相当于'fn blah(tmp:i32){let ref a = tmp; ''。第一个被称为'blah(0)',而第二个被称为'blah(&1)'。当然,在这两种情况下,函数本身,'a'的类型都是'&i32',它只是外部接口的不同。 – huon
@ huon-dbaupp,这是否意味着ref变体会先复制/移动该值? – Kroltan
*非常相关,但不完全重复,因为它不是'ref'和'&'之间的比较:http://*.com/questions/27911656/rust-by-example-the-ref-模式 – Kroltan