On Sun, Aug 11, 2013 at 6:32 PM, Tom Lee <rust-...@tomlee.co> wrote:
>
> On Sun, Aug 11, 2013 at 3:18 PM, Jens Nockert <j...@nockert.se> wrote:
>>
>>
>> On 12 Aug 2013, at 00:09, Tom Lee <rust-...@tomlee.co> wrote:
>>
>> Anyway, this sort of confusion is exactly why I don't like for..else. But
>> then maybe I'm the only one that's confused here. :)
>>
>>
>> Obviously you were not the only one, since there was a long thread without
>> clarification.
>>
>> While I think it is reasonably clear (since I am used to it), I don't
>> think it is more clear than something like (in faux pyrust)
>>
>> let iterations = xrange(100);
>>
>> for i in iterations {
>>   …
>>   if converged {
>>     break;
>>   }
>> }
>>
>> if iterations.finished() {
>>   fail!("Oh noes, it did not converge");
>> }
>>
>
> I really like this. There's no room for confusion here.

The iterator adaptors don't keep track of whether they've finished,
they only bubble up the underlying `next()` calls. The `None` will be
returned during the loop, and after that there's no way to query
whether it has finished.

For example, this is zip:

    fn next(&mut self) -> Option<(A, B)> {
        match (self.a.next(), self.b.next()) {
            (Some(x), Some(y)) => Some((x, y)),
            _ => None
        }
    }

There's a separate thread about this, but I don't think returning
`None` forever without side effects is a guarantee we should make.
Python does not make the guarantee, and the functions like `zip` there
will continue calling the underlying iterators.
_______________________________________________
Rust-dev mailing list
Rust-dev@mozilla.org
https://mail.mozilla.org/listinfo/rust-dev

Reply via email to