How to change DList elements by means of foreach?
Alexandr Druzhinin
drug2004 at bk.ru
Mon Sep 10 05:45:07 PDT 2012
10.09.2012 18:37, monarch_dodra пишет:
>
> There is a know bug: foreach with ref does not currently work these
> containers. The reason is that the container's front does not actually
> expose a reference, but a value, and that is what is being changed (the
> returned value).
>
> There is no hope in sight to really *ever* make it work, because
> "container.front += 5" can't be made to work if the returned value is
> not a reference: Unlike indexes that define opIndexOpAssign, there is no
> opFrontOpAssign.
>
> What bothers *me* though is that the code compiles fine, biting more
> than 1 user in the process.
>
> Anyways... the workaround is* making an explicit loop, with temporary
> object that is fed back into front, like this:
>
> import std.container;
>
> --------
> void main()
> {
> // double-linked list;
> DList!int dlist;
> dlist.insertFront(0);
> auto slice = dlist[]; //Extract a range manually
> for( ; !slice.empty ; slice.popFront() )
> {
> auto value = slice.front; //Extract the value
> value += 50; //Increment the value
> slice.front() = value; //Feed back into the range*
> }
>
> foreach(value; dlist) {
> assert(value == 50); //Now this works fine
> }
> }
> --------
>
> Well... this *would* work, but apparently, the implementation of
> DList.Range doesn't define front(T value). This makes the Range pretty
> much read-only. My guess is that this was an omission on the part of the
> implementer. I will fix it so that it works.
>
>
Good to know, but bad to do...
If in std.container:
1553: @property T front() { return _first._payload; }
change to:
1553: @property *ref* T front() { return _first._payload; }
doesn't it solve the problem or I don't know/understand something else?
More information about the Digitalmars-d-learn
mailing list