So why doesn't popFront return an element?

Jonathan M Davis jmdavisProg at gmx.com
Thu Apr 14 10:19:06 PDT 2011


> On 04/14/2011 01:00 AM, Andrej Mitrovic wrote:
> > I'm trying to understand the design of ranges. Why does popFront only set
> > the front() property to return the next element in the range? Why not
> > return the element in the call to popFront right away?
> > 
> > For example code like this (which doesn't work since popFront doesn't
> > return): void main()
> > {
> > 
> > int[] a = [1, 2];
> > auto b = a.popFront;
> > assert(a == [2]);
> > assert(b == 1);
> > 
> > }
> > 
> > Isn't it wasteful to have to call both popFront() and front() to
> > simultaneously remove an element from a range and return it? I mean it's
> > an extra function call, right?
> 
> I like to have three members (even if not quite necessary, this cleanly
> separates notions). Why I don't understand is why empty and front are
> methods, not simple data members.

They're properties. They could be member variables or they could be member 
functions. It's up to the implementation of a particular range as to whether 
they're member variables or member functions, though they're likely to be 
member functions in most cases. In most cases, there wouldn't be any member 
variable corresponding to empty (more likely, it's a check against the length 
of the range or does something to determine whether there's more left in the 
range rather than being a member variable indicating whether the range is 
empty), and even with front, there could easily be a calculation of some kind 
or additional checks (e.g. to make it throw if empty is true) in front.

There is no requirement that front or empty be either functions or variables. 
They're properties, so they can be whatever makes the most sense for that 
particular range type. And as for arrays, they _have_ to be functions, since 
they're added by Phobos.

- Jonathan M Davis


More information about the Digitalmars-d-learn mailing list