Pointers '的含义&;变量';在参数/模式中

Pointers '的含义&;变量';在参数/模式中,pointers,syntax,rust,Pointers,Syntax,Rust,当在模式或闭包参数中使用变量时,&variable意味着什么 for &code in self.exit_code.iter() { ... } let mut new_seps = do seps.iter().fold(~[]) |result, &next| { ... } 这里我们在中有&code和&next,用于循环和闭包定义。&在这些中签名意味着什么?为什么我们不能简单地使用code和next,而不使用符号?它与模式匹配中的ref限定符有关吗?它与trait实现

当在模式或闭包参数中使用变量时,
&variable
意味着什么

for &code in self.exit_code.iter() { ... }

let mut new_seps = do seps.iter().fold(~[]) |result, &next| { ... }
这里我们在
中有
&code
&next
,用于
循环和闭包定义。
&
在这些中签名意味着什么?为什么我们不能简单地使用
code
next
,而不使用符号?它与模式匹配中的
ref
限定符有关吗?它与trait实现中的
self
参数中的
有关吗

我在中或中都找不到有关此语法的任何内容。目前,我认为这是某种隐式的取消引用(如果我在模式中省略
&
,就会出现错误消息),但我不确定。

这是一种模式匹配,“解构”类型的东西
&T
。就是在

let &x = &1i; 
x
的类型为
int
,值为1。因此,它实际上与
ref
相反(正如@KerrekSB所说,
refx
通过引用而不是通过值捕获)

我们可以把它看作是类似的

match returns_an_option() {
    Some(a) => { ... }
    None => { ... }
}
除了
&T
的构造函数是
&
,而不是
一些


在这个特定的实例中,我猜
seps
是一个向量(您声明的错误表明它可能是
&[&str]
),因此
.iter()
返回一个实现
迭代器的对象,也就是说,它是对向量元素(
&str
)引用的迭代器,因此,您需要以某种方式取消对
next
的引用,以获得原始
&str
。这可以通过模式匹配中的
&
(如代码所示)或使用
*next
来完成


(请注意,
&
模式仅适用于隐式可复制类型,因为不能将所有权从引用/借用指针(即
&T
)移出。)

我想说它的意思是“通过借用指针捕获”,而不是“通过值捕获”。@KerrekSB,这是否意味着如果在
| result中,下一个
下一个
有类型
T
,然后在
结果中,&next
下一个
类型?我本以为是这样,但我也不确定。正如你所说,手册在这方面有点欠缺。。。不过,这应该很容易尝试!嗯,在我的代码中删除或添加
&
,会产生相当神秘的信息。我的例子可能有点复杂…如果你有一个指针类型,我认为你必须用
*
去引用(尽管有自动去引用的情况,比如数组下标);因此,如果您试图省略
*
,而它实际上是通过借用指针传递的,那么您应该会看到一个错误。(稍后当我在一台装有锈迹编译器的机器上时,我可以自己试试。)是的,你完全正确。它是
和[&str]
向量。我没有注意到
iter()
返回的是
Iterator
,而不是
Iterator
,因此产生了混淆。所以,它实际上是某种隐式的去引用,而且它也很好地符合模式匹配语义,正如我所怀疑的。非常感谢你。