我对REST还很陌生,是从LinkedIn学习网站上的"Rust Essential Training"上学到的.在第5章(程序流和控制)的末尾,我得到了以下作为章节测验的问题.

打印my_array的每个元素的以下代码有什么问题?

fn main() {
   let my_array = [1, 2, 3];

   for element in my_array {
       println!("element is {}", element);
   }
}

我想不出它有什么问题,当我在可视化代码上运行它时,它确实运行起来没有任何问题,但他们说

For循环不能直接迭代超过my_array.

该程序需要使用my_array.iter()来获取数组的迭代器.

有人能给我一个有意义的解释吗?我是不是漏掉了什么?

推荐答案

It actually works just fine on the newest versions of Rust (edition 2021 and higher).你可以亲眼看看on the Rust playground.

在以前的版本中,这不起作用,因为数组本身没有实现IntoIterator(在Rust 1.53中,有些令人困惑的是,all个版本的Rust实际上为数组实现了IntoIterator,但他们使用了一个"小技巧",使其在面向2015&;2018版本时继续不支持直接迭代,因为兼容性原因;第一个链接包括详细信息和基本原理).您必须显式转换为数组引用/片(支持迭代),或者显式地对数组调用.iter().into_iter().

其 idea 大概是强制调用者明确声明它们是否为consuming数组,或者只是通过引用迭代它(可能是可变的);.into_iter()将使用内容(在2021年,直接迭代将做同样的事情),而其他方法通过引用迭代而不使用数组的内容.

请注意,在这种特殊情况下,数组的元素实现Copy,因此无论如何迭代,数组内容都不会被使用;唯一的区别是您是在迭代对整数值的引用,还是在对整数值的引用上迭代.但对于非Copy种类型,使用实际值和仅通过引用"查看"之间的区别很重要.

Rust相关问答推荐

移植带有可变borrow 的C代码-卸载期间错误(nappgui示例)

即使参数和结果具有相同类型,fn的TypId也会不同

为什么拥有的trait对象的相等运算符移动了正确的操作数?

如果LET;使用布尔表达式链接(&Q);

为什么实例方法可以像Rust中的静态方法一样被调用?

我们能确定Rust会优化掉Clone()吗?如果它会立即掉落?

如果变量本身不是None,如何返回;如果没有,则返回None&Quot;?

为什么 `Deref` 没有在 `Cell` 上实现?

为什么`tokio::main`可以直接使用而不需要任何导入?

如何重命名 clap_derive 中的子命令占位符?

有什么办法可以追踪泛型的单态化过程吗?

如何在 Emacs Elisp 中获得类似格式化的 LSP?

Some(v) 和 Some(&v) 有什么区别?

bcrypt 有长度限制吗?

将 Futures 的生命周期特征绑定到 fn 参数

`map` 调用在这里有什么用吗?

如何在 Rust 中编写涉及异步的重试函数

字符串切片的向量超出范围但原始字符串仍然存在,为什么判断器说有错误?

意外的正则表达式模式匹配

将文件的第一行分别读取到文件的其余部分的最有效方法是什么?