为何Rust未支持根据迭代元素类型自动选择迭代方式的for循环?
Rust for循环迭代逻辑的设计疑问
在Rust中,我们知道编写如下for循环代码时:
let v = vec![1,2,3]; for i in v { println!("{i}"); }
编译器会自动调用v.into_iter()——这是因为for循环要求被迭代的集合必须实现IntoIterator trait,该 trait 定义了fn into_iter(self) -> Self::IntoIter方法,这种迭代方式会获取集合元素的所有权。
但这里有个疑问:为什么for循环的语法糖只支持这种获取所有权的迭代场景,却没有提供简化借用迭代的语法?比如借助iter()(不可变引用迭代)或iter_mut()(可变引用迭代)的场景,现在必须写:
let v = vec![1,2,3]; for &i in v.iter() { println!("{i}"); }
而非更简洁的写法:
let v = vec![1,2,3]; for &i in v { // 注:这段代码无法编译,因为默认调用into_iter()返回的是i32而非&i32 println!("{i}"); }
我想搞清楚:让编译器根据程序员需要的迭代元素类型(所有权、不可变引用、可变引用)自动选择调用into_iter()、iter()或iter_mut(),为什么是不可行的设计?如果没有合理的原因,我打算提交RFC。
内容的提问来源于stack exchange,提问作者joosts
相关产品推荐
相关产品推荐

