Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
708 views
in Technique[技术] by (71.8m points)

rust - What is the canonical way to implement is_empty for Iterator?

I have something that implements std::iter::Iterator and I want to know if there are > 0 elements. What is the standard way to do it? count() > 0 looks too expensive.

I see two candidates: any(|_| true) and nth(0).is_some(), but which one should I pick so a future reader can understand on sight what I'm checking here?

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

I would write iter.next().is_some().

However, you need to be aware that doing this advances the iterator.

fn main() {
    let scores = [1, 2, 3];
    let mut iter = scores.iter();
    
    println!("{}", iter.next().is_some()); // true
    println!("{}", iter.next().is_some()); // true
    println!("{}", iter.next().is_some()); // true
    println!("{}", iter.next().is_some()); // false
}

In many cases I'd use Peekable:

fn main() {
    let scores = [1, 2, 3];
    let mut iter = scores.iter().peekable();
    
    println!("{}", iter.peek().is_some()); // true
    println!("{}", iter.peek().is_some()); // true
    println!("{}", iter.peek().is_some()); // true
    println!("{}", iter.peek().is_some()); // true
}

so a future reader can understand on sight

I'd add a method on iterator named is_empty.


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...