One liner for creating an array filled by a factory method

Mengu mengukagan at gmail.com
Sat Dec 23 12:54:32 UTC 2017


On Saturday, 23 December 2017 at 08:57:18 UTC, kerdemdemir wrote:
> On Friday, 22 December 2017 at 23:33:55 UTC, Mengu wrote:
>> On Thursday, 21 December 2017 at 21:11:58 UTC, Steven 
>> Schveighoffer wrote:
>>> On 12/21/17 4:00 PM, kerdemdemir wrote:
>>>> I have a case like :
>>>> 
>>>> http://rextester.com/NFS28102
>>>> 
>>>> I have a factory method, I am creating some instances given 
>>>> some enums.
>>>> My question is about :
>>>> 
>>>> 
>>>> void PushIntoVector( BaseEnum[] baseEnumList )
>>>> {
>>>>      Base[] baseList;
>>>>      foreach ( tempEnum; baseEnumList )
>>>>      {
>>>>         baseList ~= Factory(tempEnum);
>>>>      }
>>>> }
>>>> 
>>>> I don't want to use "foreach" loop. Is there any cool std 
>>>> function that I can call ?
>>>> 
>>>> Something like baseEnumList.CoolStdFunc!( a=> Factory(a) 
>>>> )(baseList);
>>>> 
>>>
>>> https://dlang.org/phobos/std_algorithm_iteration.html#map
>>>
>>> -Steve
>>
>> so basically it becomes:
>>
>> Base[] baseList = baseEnumList.map!(el => Factory(el));
>>
>> there's also a parallel version of map [0] if you ever need to 
>> map the list concurrently.
>>
>> [0] https://dlang.org/phobos/std_parallelism.html#.TaskPool.map
>
> Yeah that was very easy and I used to use map for this purposed 
> a lot already. I don't know why I get confused. Thanks guys for 
> correction. I began to think like map could transform but it 
> can't create vector of elements and this confused me.

it totally depends on the type of resulting element. if you 
expect Base[], then your map should transform your range / array 
elements into a Base.

import std.range, std.algorithm;
auto a = iota(1, 10);
int[] b = a.map!(el => el + 1).array;
int[][] c = a.map!(el => [el, el + 1]).array;
writeln(b);
writeln(c);


More information about the Digitalmars-d-learn mailing list