如何从&str数组获取Item为&str的迭代器,为何array与Vec的into_iter表现不同?
问题解答
核心原因
这个差异是Rust数组的历史兼容性设计导致的,属于Rust迭代器生态的一个已知设计差异,并非语法错误。
具体解释
Vec<T>的into_iter()实现是直接返回持有所有权的迭代器,迭代项类型就是T:当你构造Vec<&str>调用into_iter()时,返回的迭代项就是&str,完全匹配day1函数对迭代器项的要求。- 数组
[T; N]的into_iter()表现特殊:在Rust 1.53版本之前,数组本身没有实现IntoIterator特征,调用into_iter()会自动把数组转为&[T]切片,再调用切片的into_iter()方法,返回的迭代项类型是&T。
你测试用的数组是[&str;5],对应T = &str,所以迭代项类型就是&&str,和函数要求的&str类型不匹配。
即使后续Rust版本为数组新增了IntoIterator实现,为了不破坏海量旧代码的兼容性,方法调用语法下数组的into_iter()仍然保留了旧行为,只有主动调用特征方法或者数组迭代器构造函数才会返回所有权迭代器。
推荐解决方案
你可以任选以下任意一种方案解决类型不匹配问题:
- 用更简洁的
copied()方法代替手动解引用的map:
#[test] fn test_day_1() { let v = ["3", "3", "4", "-2", "-4"].iter().copied(); assert_eq!(day1(v), "334-2-4334-2-4"); }
- 直接使用数组的所有权迭代器(Rust 1.53及以上版本支持):
use std::array::IntoIter; #[test] fn test_day_1() { let v = IntoIter::new(["3", "3", "4", "-2", "-4"]); assert_eq!(day1(v), "334-2-4334-2-4"); }
- 显式调用
IntoIterator特征方法绕过兼容默认行为:
#[test] fn test_day_1() { let v = IntoIterator::into_iter(["3", "3", "4", "-2", "-4"]); assert_eq!(day1(v), "334-2-4334-2-4"); }
- 保持你已经测试通过的
Vec构造写法也是完全可行的。
内容的提问来源于stack exchange,提问作者jgpaiva
相关产品推荐
相关产品推荐

