On Friday, 14 August 2015 at 00:33:30 UTC, Luís Marques wrote:
Despite using them all the time, I'm suddenly confused about ranges...

My understanding is that (for library-worth code) algorithms that consume ranges are supposed to use .save() to be compatible with both ref type and value type ranges. What about the reverse? Are algorithms supposed to try to avoid effectively .save()ing ranges (when they are value types) by not copying range variables? Furthermore, is it incorrect for an input range that is also not a forward range (or at least does not declare itself formally as a forward range by having a save()) to allow itself to be bitwise copied? (i.e., to effectively provide a save() behaviour).

I was confused a lot about ranges until I realised that a range is only a `view` onto the data. A range is not *the* data.

For example, consuming a range does not consume the underlying data or modify it in any way. A forward range's save method is for creating a copy of the view, not a copy of the underlying data. This is to allow two ranges to be consumed independently without affecting the data.

Usually, these ranges are returned in the form of a Result struct as shown here:
https://github.com/D-Programming-Language/phobos/blob/master/std/uni.d#L6517

Reply via email to