Loops Rust如何知道何时停止在没有上限的范围内迭代?
对于上的Rust练习,我发现一些解决方案选择在没有上限的范围内Loops Rust如何知道何时停止在没有上限的范围内迭代?,loops,rust,iterator,range,infinite-loop,Loops,Rust,Iterator,Range,Infinite Loop,对于上的Rust练习,我发现一些解决方案选择在没有上限的范围内filter() 下面是一个例子: pub-fn-nth(n:u32)->u32{ 设mut primes=Vec::具有_容量((n为usize)+1); (2..) .filter(|候选者|{ if!primes.iter().any(|i |候选%i==0){ primes.push(*候选者); 真的 }否则{ 假的 } }) .nth(n作为使用) .unwrap() } 我想知道在这种情况下,Rust何时停止在该范围内
filter()
下面是一个例子:
pub-fn-nth(n:u32)->u32{
设mut primes=Vec::具有_容量((n为usize)+1);
(2..)
.filter(|候选者|{
if!primes.iter().any(|i |候选%i==0){
primes.push(*候选者);
真的
}否则{
假的
}
})
.nth(n作为使用)
.unwrap()
}
我想知道在这种情况下,Rust何时停止在该范围内迭代。它是否可以迭代到类型的最大值,或者它是否可以通过检查迭代器后面的代码(例如,通过检查
.unwrap()
在示例中没有死机)来确定何时可以停止迭代?这是由于使用了。此方法将调用迭代器上的next
方法精确地n次,然后停止。迭代器中的
s被惰性地评估,因此,如果您无限多次地调用该方法,它们只会“转到无穷远”<代码>迭代器
方法,如and和内部调用next
有限次,因此没有问题
但是,如果您在非终止循环中迭代迭代器
,并且迭代器
生成一些原始数字类型,那么当您尝试迭代器超过该类型可表示的最大值时,最终会遇到溢出。示例程序:
fn main(){
对于uuin(usize::MAX-1..){
println!(“计数…”);
}
}
运行时恐慌:
线程'main'在'trust to add with overflow'时惊慌失措,/rustc/7eac88abb2e57e752f3302f022be5f3ce3d7adfb4/library/core/src/ops/arith.rs:107:1
但这并不意味着不可能永远迭代!一些方法(如)允许您创建一个无限重复的序列,该序列实际上将永远持续,直到您手动终止程序:
fn main(){
设a=[1,2,3];
设mut infinite_123=a.iter().cycle();
对于无穷大中的u 123{
println!(“哦,永远的循环”);
}
}
请注意,溢出死机仅在调试模式下发生。在释放模式下,它将永远循环。