You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Rust中数组调用into_iter()为何返回引用而非持有所有权的值?

问题根因

这个是Rust为了兼顾历史版本兼容性保留的特殊行为:

  • Rust 1.53之前,固定长度数组[T; N]没有实现IntoIterator trait,对数组调用.into_iter()时会自动降级为对数组切片&[T]调用into_iter,切片迭代器的元素类型是引用&T,所以这里你得到的就是&u8类型。
  • 即使Rust 1.53为数组新增了IntoIterator实现(迭代元素为持有所有权的T类型),为了不破坏大量依赖老行为的存量代码,.into_iter()的方法调用语法对数组仍然保留了返回引用迭代器的旧逻辑。只有两种场景会触发数组本身的IntoIterator实现:
    • 在for in循环中直接遍历数组,不手动调用into_iter
    • 显式调用IntoIterator::into_iter trait方法
修复方案

你可以选择任意一种方式解决报错:

  1. 直接遍历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;
    }
}
  1. 使用数组的into_values方法(Rust 1.54及以上版本支持),显式获取值迭代器:
for (i, b) in x.to_be_bytes().into_values().enumerate() {              
    buf[i] = b;
}
  1. 显式调用IntoIterator trait方法,规避方法调用的兼容逻辑:
for (i, b) in IntoIterator::into_iter(x.to_be_bytes()).enumerate() {              
    buf[i] = b;
}
  1. 直接对迭代得到的引用解引用(写法最简单但可读性稍差):
buf[i] = *b;
额外优化提示

你当前的代码逻辑等价于直接把to_be_bytes的返回值赋值给buf,不需要手动遍历:

let buf = x.to_be_bytes();

内容的提问来源于stack exchange,提问作者David

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 09:06:01