On 13/12/13 16:52, Marco Leise wrote:
Most non-trivial ranges do the actual work in `popFront()' and return a cached value from `front'. It has been argued as a design quirk, that this in general leads to:struct Range { bool popFrontHasBeenCalledOnce = false; T current; @property T front() { if (!popFrontHasBeenCalledOnce) { popFront(); // initializes `current' } return current; } […] }
For example in much of std.random. With classes you can get round it by defining a default constructor, but with structs it can create some tricky situations.
I have wondered about the feasibility of a method called something like .first() which would basically be called the very first time one calls _any_ method of the struct/class in question, and would perform the appropriate initialization.
