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
,因此产生了混淆。所以,它实际上是某种隐式的去引用,而且它也很好地符合模式匹配语义,正如我所怀疑的。非常感谢你。