Printing a range of ranges drains them
    Steven Schveighoffer 
    schveiguy at gmail.com
       
    Mon May 27 00:25:42 UTC 2024
    
    
  
If you print a range of ranges (that are not arrays) with 
`writeln`, even if the nested range is a forward range, `writeln` 
will drain the nested ranges.
example:
```d
import std.stdio;
import std.range;
struct R
{
     int* ptr;
     size_t len;
     int front() {return  *ptr;}
     void popFront() { ++ptr; --len; }
     bool empty() {return len == 0;}
     typeof(this) save() { return this; }
}
static assert(isForwardRange!R);
void main()
{
     int[] arr = [1, 2, 3];
     auto r = R(arr.ptr, arr.length);
     R[] mdarr = [r, r, r];
     writeln(mdarr);
     writeln(mdarr);
}
```
Output:
```
[[1, 2, 3], [1, 2, 3], [1, 2, 3]]
[[], [], []]
```
If you do this with nested arrays, it does not drain the inner 
arrays.
You can fix by un-reffing the elements of the outer array: 
`writeln(mdarr.map!(e => e));`
So, does anyone expect this behavior? If so, can you explain why 
you think this is intentionally designed this way?
I wanted to file a bug, but I was shocked that this behavior as 
far as I can tell has always existed, and nobody has ever filed a 
bug on it.
-Steve
    
    
More information about the Digitalmars-d
mailing list