Linked list, printing looks destructive.
Ali Çehreli
acehreli at yahoo.com
Mon Apr 25 02:19:46 UTC 2022
On 4/24/22 18:40, Alain De Vod wrote:
> I think this has something to do with popFront
This type violates a fundamental rule: Containers and ranges are
separate concepts. Your List is a container, not a range. I changed your
code by moving the range functions to a Range struct that is created by
opSlice():
class List {
Node * root=null;
this(int[] AR){foreach(i ; AR)pushfront(i);}
auto opSlice() {
return Range(root);
}
static struct Range {
Node * root_;
bool empty() const {return !root_;}
void popFront() {root_=root_.next;}
float front() const {return root_.element;}
}
void pushfront(int element) {
Node * newnode=new Node();
newnode.element=element;
newnode.next=root;
root=newnode;
}
}//List
The foreach loop implicitly calls opSlice() and it all works.[1] When
you want a range, you can call opSlice indirectly by using [] after the
object:
import std.algorithm;
writeln(l[].map!(e => e * 2));
Ali
[1] As reported recently by Steven Schveighoffer, this information is
missing in my book:
https://bitbucket.org/acehreli/ddili/issues/33/add-additional-foreach-mechanism-to-range
More information about the Digitalmars-d-learn
mailing list