我明白怎么做 &
有效,但有什么区别 ref
?它们可以互换吗?
我发现的唯一信息(因为在Google上搜索符号效果不佳)是 关于Rust的例子,但它没有解释两者之间的区别。 书 信息量不大,而且 ref
只列在 模式 章节。但似乎是这样 ref
也在该上下文之外使用。
那么,有什么用呢? ref
,有什么区别 &
?
我明白怎么做 &
有效,但有什么区别 ref
?它们可以互换吗?
我发现的唯一信息(因为在Google上搜索符号效果不佳)是 关于Rust的例子,但它没有解释两者之间的区别。 书 信息量不大,而且 ref
只列在 模式 章节。但似乎是这样 ref
也在该上下文之外使用。
那么,有什么用呢? ref
,有什么区别 &
?
ref
用于模式以绑定对a的引用 左值 (左值是一个值,您可以采用或多或少的地址)。
重要的是要理解模式从正常表达式“向后”,因为它们已经习惯了 解构 值。
这是一个简单的例子。假设我们有这个:
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
。
但是,并不总是可以用两种方式编写相同的表达式。例如,你不能使用 &
引用存储在枚举变体中的值:您需要匹配它。例如,如果要引用a中的值 Some
,你需要写:
match option {
Some(ref value) => { /* stuff */ }
None => { /* stuff */ }
}
因为在Rust中没有办法可以使用 &
运算符以其他方式访问该值。