在 for 循环中引用/取消引用向量元素

2024-01-20

在下面的代码中,我想保留number_list,迭代之后,因为.into_iter() that for默认使用会消耗。因此,我假设n: &i32我可以获得的值n通过解除引用。

fn main() {
    let number_list = vec![24, 34, 100, 65];
    let mut largest = number_list[0];

    for n in &number_list {
        if *n > largest {
            largest = *n;
        }
    }

    println!("{}", largest);
}

据我透露,我们可以使用&n作为“模式”:

fn main() {
    let number_list = vec![24, 34, 100, 65];
    let mut largest = number_list[0];

    for &n in &number_list {
        if n > largest {
            largest = n;
        }
    }

    println!("{}", largest);
    number_list;
}

我的困惑(并记住我没有涵盖模式)是我希望从那时起n: &i32, then &n: &&i32而不是解析为值(如果甚至可以使用双引用)。为什么会出现这种情况,其含义是什么&根据上下文而有所不同?


将引用视为一种容器可能会有所帮助。为了进行比较,请考虑Option,我们可以使用模式匹配“解开”值,例如在if let陈述:

let n = 100;
let opt = Some(n);

if let Some(p) = opt {
    // do something with p
}

We call Some and None 构造函数 for Option,因为它们各自产生一个类型的值Option。同样的,你可以想到&作为构造函数的参考。并且语法是对称的:

let n = 100;
let reference = &n;

if let &p = reference {
    // do something with p
}

您可以在将值绑定到变量的任何地方使用此功能,这种情况随处可见。例如:

  1. if let, 如上

  2. match表达式:

    match opt {
        Some(1) => { ... },
        Some(p) => { ... },
        None    => { ... },
    }
    match reference {
        &1 => { ... },
        &p => { ... },
    }
    
  3. 在函数参数中:

    fn foo(&p: &i32) { ... }
    
  4. Loops:

    for &p in iter_of_i32_refs {
        ...
    }
    

并且可能more https://doc.rust-lang.org/book/second-edition/ch18-01-all-the-places-for-patterns.html.

请注意,最后两个不起作用Option因为如果None被发现而不是Some,但是引用不会发生这种情况,因为它们只有一个构造函数,&.

的意思是&根据上下文而有所不同?

希望你能解释一下&作为构造函数而不是运算符,那么您会发现它的含义没有改变。这是 Rust 的一个非常酷的功能,您可以在表达式的右侧使用构造函数来创建值,并在左侧使用构造函数来将它们分开(解构)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 for 循环中引用/取消引用向量元素 的相关文章

  • 强制 io::stdio 和 BufReader 之间的 BufRead 特征兼容性

    我正在尝试输入双关语io stdio实例和一个BufReader包装一个文件 以便我可以编写假设缓冲输入源的代码 我尝试了几种尝试投射的变体io stdio to a BufRead类型和所有都因以下一种或多种变体而失败 error mis
  • 创建表时 MySQL 语法错误

    我正在尝试在 Filemaker gt MySQL 转换脚本中使用此查询 表创建步骤直接从 phpMyAdmin 导出中获取 并添加到 DROP 语句中 DROP TABLE IF EXISTS artifacts CREATE TABLE
  • 怎么格式化啊!从条件表达式返回 &str?

    我遇到这个问题的地方format 据我所知 以不锚定任何东西的模式创建一个临时值 let x 42 let category match x 0 9 gt Between 0 and 9 number 10 gt format It s a
  • 快速向量初始化 C++ [重复]

    这个问题在这里已经有答案了 可能的重复 C 使用硬编码元素初始化 STL 向量的最简单方法 https stackoverflow com questions 2236197 c easiest way to initialize an s
  • 使用 Cuda 并行读取多个文本文件

    我想使用 CUDA 在多个文件中并行搜索给定字符串 我计划使用 pfac 库来搜索给定的字符串 问题是如何并行访问多个文件 示例 我们有一个包含 1000 个文件的文件夹 需要搜索 这里的问题是我应该如何访问给定文件夹中的多个文件 应该动态
  • Java 中正则表达式回溯直到溢出

    下面的表达式 ifdef FEATURE s r n endif s s end of s FEATURE 运行我编译的 Jar 文件时覆盖匹配缓冲区 匹配字符串可以类似于 这是一条垃圾线 ifdef 功能 endif 功能结束 这是一条垃
  • 结构体指针运算符猜想(理论)

    结构体指针的使用非常频繁 因此有一个特殊的运算符 gt 下面的表达式是等价的 x y x gt y 将此运算符简单地视为如下定义的预处理器宏是否公平 define x gt x 为什么或者为什么不 或者它从一开始就被编码为运算符 这有何不同
  • Rust:根目录中没有“模块”

    当我跑步时use crate feed in src cmdline rs我希望导入src feed rs 但事实并非如此 相反我得到 error E0432 unresolved import crate feed gt src cmdl
  • 如何在 Vim 中仅在某些上下文中启用语法隐藏?

    我想隐藏名称基于希腊符号的变量 并将它们转换为 Unicode 等效符号 类似于vim 可爱的 python https github com ehamberg vim cute python作品 例如 我有这个 syntax match
  • 如何使用 serde_json 从 JSON 数组内部流式传输元素?

    我有一个 5GB JSON 文件 它是具有固定结构的对象数组 first John last Doe email email protected cdn cgi l email protection first Anne last Orth
  • 有条件地从 flat_map 返回空迭代器

    鉴于这个定义foo let foo vec vec 1 2 3 vec 4 5 6 vec 7 8 9 我希望能够编写这样的代码 let result Vec lt gt foo iter enumerate flat map i row
  • 如何使用diesel-rs选择色谱柱的子集?

    我现在花了几个小时的时间来查询表的可用列的子集以及在其中包含计算 我知道这不是在选择查询中执行计算的最佳方式 但现在 我只是在开发一个原型 它应该是可行的 我在用diesel rs作为后端实现中所有数据库操作的 ORM 数据将存储在 Pos
  • Ruby 试图掌握一种新的表示法。 (inject(:) 与 select(and:even?);为什么有 &?)

    所以 我刚刚了解到 而不是写这样的东西 1 2 3 4 5 inject x y x y gt 15 我可以写 1 2 3 4 5 inject gt 15 我还了解到 而不是写 1 2 3 4 5 select x x even gt 2
  • 为什么我要使用发散函数?

    读 Rust 书时 我发现一个有趣的话题 发散函数 https doc rust lang org stable book first edition functions html diverging functions Rust 有一些特
  • 检查自定义结构的相等性

    我正在尝试检查两个 功能相同 结构的相等性 derive PartialEq Debug pub struct TypeA lt a gt a str derive PartialEq Debug pub struct TypeB lt a
  • Rust 迭代器和 C++ 迭代器之间的主要区别是什么? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 C 迭代器的一个典型示例是指针 可用于指向 C 数组中的元素 如下所示 int array 1 2 3 4 int begin std
  • 如何在 Rust 中从文字创建格式化字符串?

    我将根据给定的参数返回一个字符串 fn hello world name Option
  • 在yaml中写入#(在字符串中)

    我是新使用 yml 文件 用于我的框架中的翻译 我试图在翻译中添加一个 将是一个推特分享 blabla 这可能吗 因为文件将其翻译为评论 只需将值放在单引号或双引号内 它就不会被视为注释 就像是 en twitter share hasht
  • 通过 __get() 通过引用返回 null

    快速规格 PHP 5 3 error reporting 1 the highest 我正在使用 get 通过引用技巧神奇地访问对象中任意深度的数组元素 快速示例 public function get key return isset t
  • Scala 和变量中的模式匹配

    我是 Scala 新手 有点想知道模式匹配是如何工作的 想象一下我有以下内容 case class Cls i Int case b Cls i gt Ok case e Cls gt Ok case f Cls gt Ok case s

随机推荐