Below you will find pages that utilize the taxonomy term “rust”
November 28, 2023
Rust中与闭包相关的三个trait
"在 Rust 中,闭包就是一种能捕获 上下文环境变量 的函数。\nlet range = 0..10; let get_range_count = || range.count(); 代码里的这个 get_range_count 就是闭包,range 是被这个闭包捕获的环境变量。\n虽然说它是一种函数,但是不通过 fn 进行定义。在 Rust 中,并不把这个闭包的类型处理成 fn 这种函数指针类型,而是有单独的类型定义。\n切记这里是将闭包处理成是 单独的类型定义,这一点区别与其它开发语言。\n至于按哪一种类型来处理,这个没有办法得知,因为只有在Rust编译器在编译的时候才可以确定其类型,并且在确定类型时,还需要根据这个闭包捕获上下文环境变量时的行为来确定。\n闭包trait分类 根据闭包行为划分为三类trait( 主因是受到所有权影响):\nFnOnce 适用于能被调用一次的闭包,所有闭包都至少实现了这个 trait,因为所有闭包都必须能够被调用。一个会将捕获的值移出闭包体的闭包只实现 FnOnce trait,这是因为它只能被调用一次。其获取了上下文环境变量的所有权。 FnMut 适用于不会将 …"
November 16, 2023
Rust中的迭代器iter
"迭代器模式允许你对一个序列的项进行某些处理。迭代器(iterator)负责遍历序列中的每一项和决定序列何时结束的逻辑。当使用迭代器时,我们无需重新实现这些逻辑。\n在 Rust 中,迭代器是 惰性的(lazy),这意味着在调用方法使用迭代器之前它都不会有效果。例如,示例中的代码通过调用定义于 Vec 上的 iter 方法在一个 vector v1 上创建了一个迭代器。这段代码本身没有任何用处:\nlet v1 = vec![1, 2, 3]; let v1_iter = v1.iter(); 迭代器被储存在 v1_iter 变量中。一旦创建迭代器之后,可以选择用多种方式利用它。\n迭代器分类 Rust 中迭代器根据 所有权 可分为 iter()、iter_mut()、into_iter() 三种迭代器,使用场景:\n获取集合元素不可变引用的迭代器,对应方法为 iter()\n获取集合元素可变引用的迭代器,对应方法为 iter_mut()\n获取集合元素所有权的迭代器,对应方法为 into_iter()\n也就是说当你在 Rust 中看到调用了 iter() 方法,则表示这里使用了不可变迭代器,只能读 …"
November 7, 2023
Rust 中的 Result 与 Option
"在 Rust 中有两个常用的 enum 枚举类型,分别为 Result 和 Option,本节介绍它们两者各自的使用场景和用法。\n这里我们先给出结论\n结果 Result 表示 成功 或 失败 选项 Option 表示 有 或者 无 当从本地读取一个文件时,这时候可能读取成功,也有可能由于文件不存在或权限不足导致读取时候,这种场景一般就需要使用 Result;而当从一组数据集中查询指定元素是否存在时,这时有可能存在,也有可能不存在(用None 表示),这时情况就应该选择Option。\n由此看到,这两个枚举类型的区别理解起来还是挺简单的,下面我们单独对每一种类型做一下详细的介绍。\n结果 Result 定义\nenum Result\u0026lt;T, E\u0026gt; { Ok(T), Err(E), } Result\u0026lt;T, E\u0026gt; 类型拥有两个取值:\nOk(value) 表示操作成功,并包装操作返回的 value(value 拥有 T 泛类型)。 Err(why),表示操作失败,并包装 why,它(但愿)能够解释失败的原因(why 拥有 E 类型)。 举个例子,这里打开一个文件,如果文件存在则 …"