我是 Rest 新手,正在通过 Linkedin Learning 上的“Rust Essential Training”学习它。在第 5 章(程序流程和控制)的末尾,我得到了以下问题作为章节测验。
下面打印 的每个元素的代码有什么问题
my_array?Run Code Online (Sandbox Code Playgroud)fn main() { let my_array = [1, 2, 3]; for element in my_array { println!("element is {}", element); } }
我想不出它有什么问题,当我在可视化代码上运行它时,它确实运行没有任何问题,但他们说
my_arrayfor循环不能直接迭代。该程序需要使用
my_array.iter()来获取数组上的迭代器。
有人能给我一个有意义的解释吗?我在这里错过了什么吗?
实际上,它在最新版本的 Rust(1.53 及更高版本)上运行得很好。您可以在 Rust 游乐场上亲眼目睹。
在 1.53 之前,这不起作用,因为数组本身没有实现IntoIterator. 从 Rust 1.53 开始,有些令人困惑的是,所有版本的 Rust 实际上都实现了IntoIterator数组,但是:
.into_iter()数组相当于直接迭代(它消耗).into_iter()相当于调用.iter()(通过引用进行非消耗性迭代)或更严格地说,array.into_iter()解析为(&array).into_iter(),并将数组引用转换为迭代器,从而生成由数组支持的非消耗性迭代器。版本之间的区别是由于一个“小黑客”造成的,尽管数组IntoIterator在 1.53、2015 和 2018 年的所有版本上实现,但编译器仅针对.into_iter()数组上的方法调用语法的情况隐藏了这一事实,因此相反,它解析为(这就是数组根本(&array).into_iter()没有实现时发生的情况)。IntoIterator这是一个 hack,因为它单独防御方法调用语法;任何其他迭代数组的方法(例如直接迭代,iter.zip直接调用IntoIterator::into_iter数组)都会发现它是一个IntoIterator并通过(消耗)值迭代它,但是这些方法在 1.53 之前都不起作用,所以没有现有的代码依赖于它们(array.into_iter()在 Rust 2015 或 2018 上编译将发出响亮的警告,表明 Rust 2021 中的含义发生了变化)。
在 1.53 之前,您必须显式转换为数组引用/切片(支持迭代),或者在数组上显式调用.iter()或.into_iter()(后者仍然是非消耗性的,解析为(&array).into_iter();这就是需要 hack 的原因) ,因此新功能不会改变 2015 年和 2018 年现有代码中的行为)。
请注意,在这种特殊情况下,数组的元素实现了Copy,因此无论如何迭代,数组内容都不会被消耗;唯一的区别是您是在整数引用上迭代还是在整数值上迭代。但对于非Copy类型来说,使用实际值和仅通过引用“查看”之间的区别很重要。
| 归档时间: |
|
| 查看次数: |
142 次 |
| 最近记录: |