在参数/模式中,'&variable' 的含义是什么?

7
当在模式或闭包参数中使用&variable时,它代表什么意思?
for &code in self.exit_code.iter() { ... }

let mut new_seps = do seps.iter().fold(~[]) |result, &next| { ... }

这里我们在for循环和闭包定义中使用了&code&next。这些中的&符号是什么意思?为什么不能简单地使用codenext,不带上&符号?这是否与模式匹配中的ref限定符有关?这是否与特质实现中的self参数中的&有关?
我在当前Rust参考手册教程中都没有找到关于这种语法的任何信息。目前我认为这是某种隐式解引用(如果我在模式中省略&,则会出现错误消息),但我不确定。

我认为它的意思是“通过借用指针来捕获”,而不是“按值传递”。 - Kerrek SB
我本以为是这样,但我也不确定。正如你所说,手册在这方面有点欠缺...不过这应该很容易尝试! - Kerrek SB
嗯,在我的代码中删除或添加&会导致相当神秘的消息。尽管我的例子可能有点复杂... - Vladimir Matveev
如果你有一个指针类型,我认为你必须使用 * 解引用(虽然有自动解引用的情况,比如数组下标);所以如果你尝试省略 * 并且它确实是通过借用指针传递的,你应该会看到相应的错误。(当我在一台带有 Rust 编译器的机器上时,我可以自己尝试一下。) - Kerrek SB
@KerrekSB,我在比较中使用 nextif next == "\\s" { ... },省略 & 会出现 error: mismatched types: expected &&strbut found&'static str (expected &-ptr but found &'static str)。如果加上 & 就没问题了。看来在使用静态生命周期时会出现问题……我稍后再检查一下。 - Vladimir Matveev
显示剩余3条评论
1个回答

11

这是一种模式匹配,对类型为&T的内容进行“解构”。也就是说,在...

let &x = &1i; 

x的类型是int,值为1。所以它实际上与ref相反(ref x按引用而非按值捕获,这是@KerrekSB所说的)。

可以将其视为类似于

match returns_an_option() {
    Some(a) => { ... }
    None => { ... }
}

除非 &T 的构造函数是 &,而不是 SomeNone


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

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


是的,你完全正确。它是&[&str]向量。我没有注意到iter()返回的是Iterator<&T>而不是Iterator<T>,因此产生了混淆。所以,它确实是某种隐式解引用,并且它也很好地配合了模式匹配语义,正如我所怀疑的那样。非常感谢你。 - Vladimir Matveev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接