What is the best way to implement different implementations of a trait on the same struct? Let's I have a struct containing items and I want to have different ways to iterate through them.
Iterator structs are usually ancillary structs and not your primary data holding struct, since they have to hold their own "where am I in the iteration" state. For example, Vec uses
vec::IntoIter to iterate by value (consuming the Vec)
If don't want to do this, we're back to your original question
You can't do this directly -- you can only have one implementation per concrete type (aka coherence). Using wrapper structs like you have done is a viable workaround. Depending on your use case, you might want to wrap &mut Batch instead of Batch itself.
I imagine your examples were just for illustration, but when it comes to iterators, another possibility is to just use existing combinators like StepBy.