Assigning map result, and in-place map

Bert van Leeuwen bert at e.co.za
Fri Sep 3 03:29:37 PDT 2010


Thanks!

Nick Sabalausky Wrote:

> "Bert van Leeuwen" <bert at e.co.za> wrote in message 
> news:i5qftb$2a25$1 at digitalmars.com...
> > I'm a D n00b, so excuse my question if it is silly. I've cursorily 
> > "followed" D for a few years, but only now bought "The D Programming 
> > Language" (great book, very nicely written!) and started to really play 
> > with it.
> >
> 
> Welcome! :)
> 
> > I've run into two questions which I have not been able to find the answers 
> > to online.
> >
> > 1) I have an int array which I want to replace elements of with 
> > compile-time string expression, e.g.
> >
> > i=new int[100];
> > auto b=map!("(a==0)?42:a")(i);
> > writeln(b);
> >
> > Cool, that works. But now I want to get at the resulting array. If I 
> > replace "auto b" with:
> > int[] b = map ...
> > that does not work ("cannot implicitly convert expression (map(i)) of type 
> > Map!(result,int[]) to int[]")... fine, but how do I get to the int[] ?
> >
> 
> Instead of returning an array, map returns a range that computes the values 
> lazily (on-demand when they're needed, instead of always computing all of 
> them right away). This is done for performance reasons. But you can get an 
> array with the array() function from the "std.array" module:
> 
> auto b = array( map!("(a==0)?42:a")(i) );
> 
> or
> 
> auto b=map!("(a==0)?42:a")(i);
> auto ba = array(b);
> 
> BTW, instead of:
> 
> map!("(a==0)?42:a")(i)
> 
> You can do:
> 
> map!"(a==0)?42:a"(i)
> 
> A nifty little bit of syntax sugar for when there's only one template 
> parameter.
> 
> > 2) Related to above, I want to do something like map, but not return a new 
> > array, I want to modify elements in-place in the array. How do I do that? 
> > (without explicitly iterating with foreach etc.)
> 
> I'll leave this one for someone else to answer, as I don't know whether or 
> not something like this is already in phobos. If not, such a function can 
> definitely be made, and maybe someone has already done so...?
> 
> 
> 



More information about the Digitalmars-d mailing list