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