On Fri, Feb 14, 2014 at 12:35 AM, Daniel Micay <danielmi...@gmail.com>wrote:
> On Thu, Feb 13, 2014 at 6:33 PM, Erick Tryzelaar > <erick.tryzel...@gmail.com> wrote: > > On Thursday, February 13, 2014, Gábor Lehel <glaebho...@gmail.com> > wrote: > >> > >> > >> > >> This is not strictly true. > >> > >> If instead of > >> > >> fn next(&mut self) -> Option<A>; > >> > >> we had something like > >> > >> fn next(self) -> Option<(Self, A)>; > >> > >> then access to exhausted iterators would be ruled out at the type level. > >> > >> (But it's more cumbersome to work with and is currently incompatible > with > >> trait objects.) > > > > This is an appealing option. If it is really this simple to close this > > undefined behavior, I think we should consider it. Are there any other > > downsides? Does it optimize down to the same code as our current > iterators? > > It's certainly not as convenient and would only work if all iterators > were marked as `NoPod`. > Even if it were `Pod` (i.e. copyable), the state of the old copy would be left unchanged by the call, so I don't think this is a problem. You could also recover the behavior of the existing `Fuse` adapter (call it any number of times, exhaustion checked at runtime) by wrapping it in an `Option` like so: fn next_fused<T, Iter: Iterator<T>>(opt_iter: &mut Option<Iter>) -> Option<T> { opt_iter.take().and_then(|iter| { iter.next().map(|(next_iter, result)| { *opt_iter = Some(next_iter); result }) }) } Dunno about performance. Lots of copies/moves with this scheme, so it seems possible that it might be slower.
_______________________________________________ Rust-dev mailing list Rust-dev@mozilla.org https://mail.mozilla.org/listinfo/rust-dev