Ranges seem awkward to work with
Nicholas Wilson via Digitalmars-d-learn
digitalmars-d-learn at puremagic.com
Mon Sep 11 18:18:21 PDT 2017
On Tuesday, 12 September 2017 at 01:13:29 UTC, Hasen Judy wrote:
> Is this is a common beginner issue? I remember using an earlier
> version of D some long time ago and I don't remember seeing
> this concept.
>
> Now, a lot of library functions seem to expect ranges as inputs
> and return ranges as output.
>
> Even parsing a csv line returns a range. And the funny thing
> is, once you loop over it, it's done. You've basically consumed
> it.
>
> For example, I was having some trouble with the api of the
> std.csv module, so to help me debug, I printed the result of
> the csv. ok, the result seems good. Now I try to use it, for
> example:
>
> auto name = row[1];
>
> And to my surprise there's a runtime error, something about
> range something something. I don't even remember what the error
> was. The thing is, it wasn't clear what was going on.
>
> The line was actually more like:
>
> auto some_var =
> some_function(row[1].some_other_library_method!template_variable);
>
> So because I was calling several library methods on the same
> line, I thought the problem might have something to do with the
> range not exactly matching what the library was expecting. I
> thought maybe row[1] also returned some range instead of a
> string and that range had something wrong with it.
>
> Well, it turned out that my earlier attempt to print the parsed
> csv row resulted in the row being "consumed" and now the row is
> an empty range(!).
>
> Is there a straight forward way to convert a Range to a list
> other than manually doing a foreach?
>
> string[] items;
> foreach(item; someRangeThing) {
> items ~= item;
> }
>
> I feel like that is a bit of an overkill.
if `range.save` works use that, otherwise
`range.dup` will duplicate the range
or `range.array` (from std.array) will enumerate the range into
an array (which is pretty much the same as your solution above.
More information about the Digitalmars-d-learn
mailing list