&variable
用于模式或闭包参数时是什么意思?
for &code in self.exit_code.iter() { ... }
let mut new_seps = do seps.iter().fold(~[]) |result, &next| { ... }
这里我们在for
循环和闭包定义中有&code
和&next
。 &
符号是什么意思?为什么我们不能简单地使用 code
和 next
,而不使用 & 符号?它与模式匹配中的 ref
限定符有关吗?它与特征实现中self
参数中的&
有关吗?
我在 current Rust reference manual 中都找不到关于此语法的任何内容也不在tutorial .目前我认为这是某种隐式取消引用(如果我在模式中省略 &
就会出现错误消息),但我不确定。
最佳答案
这是一个模式匹配,“解构”类型的东西 &T
.也就是说,在
let &x = &1i;
x
类型为 int
, 和值 1. 所以它实际上与 ref
相反(按照@KerrekSB 的说法,ref x
通过引用而不是值进行捕获)。
可以认为它类似于
match returns_an_option() {
Some(a) => { ... }
None => { ... }
}
&T
的构造函数除外是&
, 不是 Some
或 None
.
在这个特定的例子中,我猜 seps
是一个向量(你说的错误表明它可能是一个 &[&str]
),所以 .iter()
返回一个实现 Iterator<& &str>
的对象,也就是说,它是对向量元素 ( &str
) 的引用的迭代器,因此,您需要取消引用 next
以某种方式获得原始 &str
.这可以通过 &
来完成在与 *next
的模式匹配中(如代码所示)或使用时。
(请注意,&
模式仅适用于隐式可复制类型,因为不能将所有权从引用/借用 指针(即 &T
)移出。)
关于pointers - 参数/模式中 '&variable' 的含义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19066402/