Rust中数组调用into_iter()为何返回引用而非持有所有权的值?
问题根因
这个是Rust为了兼顾历史版本兼容性保留的特殊行为:
- Rust 1.53之前,固定长度数组
[T; N]没有实现IntoIteratortrait,对数组调用.into_iter()时会自动降级为对数组切片&[T]调用into_iter,切片迭代器的元素类型是引用&T,所以这里你得到的就是&u8类型。 - 即使Rust 1.53为数组新增了
IntoIterator实现(迭代元素为持有所有权的T类型),为了不破坏大量依赖老行为的存量代码,.into_iter()的方法调用语法对数组仍然保留了返回引用迭代器的旧逻辑。只有两种场景会触发数组本身的IntoIterator实现:- 在
for in循环中直接遍历数组,不手动调用into_iter - 显式调用
IntoIterator::into_itertrait方法
- 在
修复方案
你可以选择任意一种方式解决报错:
- 直接遍历
to_be_bytes返回的数组,for循环会自动调用数组的IntoIterator实现,拿到u8类型的元素:
use core::mem::size_of; const SIZE: usize = size_of::<u64>(); fn main() { let x: u64 = 512; let mut buf: [u8; SIZE] = [0; SIZE]; for (i, b) in x.to_be_bytes().enumerate() { buf[i] = b; } }
- 使用数组的
into_values方法(Rust 1.54及以上版本支持),显式获取值迭代器:
for (i, b) in x.to_be_bytes().into_values().enumerate() { buf[i] = b; }
- 显式调用
IntoIteratortrait方法,规避方法调用的兼容逻辑:
for (i, b) in IntoIterator::into_iter(x.to_be_bytes()).enumerate() { buf[i] = b; }
- 直接对迭代得到的引用解引用(写法最简单但可读性稍差):
buf[i] = *b;
额外优化提示
你当前的代码逻辑等价于直接把to_be_bytes的返回值赋值给buf,不需要手动遍历:
let buf = x.to_be_bytes();
内容的提问来源于stack exchange,提问作者David
相关产品推荐
相关产品推荐

