pointers - 参数/模式中 '&variable' 的含义

标签 pointers syntax rust

&variable 用于模式或闭包参数时是什么意思?

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

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

这里我们在for循环和闭包定义中有&code&next& 符号是什么意思?为什么我们不能简单地使用 codenext,而不使用 & 符号?它与模式匹配中的 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的构造函数除外是& , 不是 SomeNone .


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

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

关于pointers - 参数/模式中 '&variable' 的含义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19066402/

相关文章:

c - 将静态分配数组的地址获取到结构内的指针中

mysql - 是什么导致此 MySQL 查询中的语法错误?

enums - 模式匹配借用的包含枚举的 HashMap

rust - 如何在Rust中将字节迭代器转换为流

c++ - 重新分配指针给出错误

arrays - C 中 char ** 和 char (*)[100] 有什么区别?

syntax - 将 throws 子句放在属性声明中的什么位置?

rust - 创建向上或向下步进的迭代器

c - 为什么浮点指针的取消引用设置为 int 变量的地址打印为 `0` ?

C++:指示一个函数可能会抛出