writeln wipes contents of variables ?

W.J. via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Fri Jan 22 04:44:14 PST 2016


On Friday, 22 January 2016 at 01:49:58 UTC, anonymous wrote:
> On 22.01.2016 01:49, W.J. wrote:
>> How can I identify those ranges, or, how can I tell if any 
>> particular
>> range has value semantics ? I didn't read any of this in the 
>> manual -
>> not that I could remember anyways.
>
> Generally you shouldn't. If you care about it either way, use 
> .save or std.range.refRange.
>
> If you don't want some range r to be consumed by some 
> operation, pass r.save instead of plain r. If you want r to be 
> consumed, pass refRange(&r). Only if you don't care if r is 
> consumed or not, should you pass simply r.
>
> If you know for a fact that copying r is the same as r.save, 
> then you can just pass (and copy) r, of course. We know it's 
> that way with dynamic arrays, because of their nature as 
> pointer+length structures. But there's nothing wrong with 
> calling .save on an array anyway.
>
> Also, when a function takes a range via a ref parameter, then 
> you don't need refRange, of course. The ref parameter ensures 
> that no copy is made and that the original range is affected by 
> the function.

This is even better than trying to figure out whether value 
semantics are supported or not.

So, .safe returns a copy of the range - I suppose a copy of the 
current state - and refRange always consumes the values in the 
range.

Thanks a lot for your reply! Very much appreciated.



More information about the Digitalmars-d-learn mailing list