迭代 aRange<T>
似乎消耗了范围实例,因为into_iter
函数获取了范围的所有权。通过查看range 的文档,很明显该Borrow
特征仅针对动态范围对象实现。如果没有克隆,是否可以遍历一个范围,同时将该范围的不可变引用传递给其他函数?
let numbers = 500..4000;
// ERROR [(E0277)]: the trait `std::iter::Iterator` is not implemented for `&std::ops::Range<i32>`
for n in &numbers {
println!("{}", n);
do_something_else(&numbers);
reuse_range(&numbers);
}
// Surprisingly, there are no errors when it comes to argument type of functions.
fn do_something_else(range: &Range<i32>) { }
fn reuse_range(range: &Range<i32>) { }
如上所示,函数可以借用,Range<T: Sized>
但编译器本身不允许借用范围。
到目前为止,我已经尝试使用Box
智能指针,但行为是相同的。简单地说,by_ref()
是可用的,但这也会限制我们作为不可变借用,因为我们已经有了对同一个对象的可变借用。