Returning an iterator

() is expected because this if lacks the else branch. You can either change this if to early return:

        if self.input_args.len() != 0 {
            return self.input_args.iter()
        }

or put the rest of the function in the else branch.


There are also some other issues with the code. Here you try to borrow a temporary String (line):

        stdin().lock().lines().into_iter()
            .map(|line| &line.expect("IO error"))

this will result in "does not live long enough" error. The simplest solution would be to change Item=&String to Item=String (in general, if you return a reference, the true owner needs to already exist before calling the function).

Also, Rust won't allow you to return two different iterators in a -> impl Iterator function. You can work around that by returning Box<dyn Iterator> or using enum approach, eg. by using the either crate. Here's a thread describing a similar issue. And another one.

2 Likes