std.algorithm each documentation terse
jmh530 via Digitalmars-d-learn
digitalmars-d-learn at puremagic.com
Mon Jul 20 07:40:57 PDT 2015
I have found the documentation for each in std.algorithm a bit
terse. It seemed like it was an eager version of map, but it
seems to be a bit more limited than that.
In particular, the documentation says that if you can mutate the
value in place, then you can call each on it. The first thing I
noticed is that this works easiest (beyond in place operators)
when you're using a void function and taking the input you want
to change as ref. This is what I did in the foo and bar functions
below. However, it's not the same thing as just applying the
function. In the baz function, I mutate the value and then return
a different value. Using baz with each doesn't change the value
by 2, only by 1.
What really confused me is that I can't use a lambda with each in
a similar way as map. I think this is because the lambdas I'm
using really aren't void functions. The part after the => is
basically a return statement, so I'm not really mutating anything
in place. Is there any way to do this with lambdas or are void
functions required?
Is there a way to write a void lambda that would work with each?
import std.range : iota;
import std.algorithm : each;
import std.array : array;
void foo(ref int x)
{
x += 1;
}
void bar(ref int x)
{
x *= x;
}
int baz(ref int x)
{
x += 1;
return x + 1;
}
void main()
{
auto x = iota(3).array;
x.each!((ref a) => a++);
assert(x == [1, 2, 3]); //What you would expect
x.each!((ref a) => foo(a));
assert(x == [2, 3, 4]); //What you would expect
x.each!((ref a) => bar(a));
assert(x == [4, 9, 16]); //What you would expect
x.each!((ref a) => baz(a));
assert(x == [5, 10, 17]); //What I would expect after thinking
about it for a while
x.each!((ref a) => a + 1);
assert(x == [5, 10, 17]); //Not what I would expect
x.each!((ref a) => a * a);
assert(x == [5, 10, 17]); //Not what I would expect
}
More information about the Digitalmars-d-learn
mailing list