Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
704 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 Answer

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.


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

2.1m questions

2.1m answers

60 comments

56.7k users

...