On Thursday, 6 October 2016 at 20:11:17 UTC, ag0aep6g wrote:
On 10/06/2016 09:54 PM, TheGag96 wrote:
Interestingly enough, I found that using .each() actually
compiles
without the []
[...]
why can the compiler consider it a range here but not
.sort()?
each is not restricted to ranges. It accepts other
`foreach`-ables, too. The documentation says that it "also
supports opApply-based iterators", but it's really anything
that foreach accepts.
[snip]
Thanks! Explains some things. I knew each! was callable in
different circumstances than other functional operations, but
hadn't quite figured it out. Looks like reduce! and fold! also
take iterables.
There also appears to be a distinction between the iterator and
range cases when a ref parameter is used. As it iterator, each!
won't modify the reference. Example:
void main()
{
import std.algorithm : each;
int[] dynamicArray = [1, 2, 3, 4, 5];
int[5] staticArray = [1, 2, 3, 4, 5];
dynamicArray.each!((ref x) => x++);
assert(dynamicArray == [2, 3, 4, 5, 6]); // modified
staticArray.each!((ref x) => x++);
assert(staticArray == [1, 2, 3, 4, 5]); // not modified
staticArray[].each!((ref x) => x++);
assert(staticArray == [2, 3, 4, 5, 6]); // modified
}
This distinction is a bit on the nuanced side. Is it behaving as
it should?
--Jon