foreach UFCS
Q. Schroll via Digitalmars-d-learn
digitalmars-d-learn at puremagic.com
Thu Mar 31 06:49:22 PDT 2016
On Thursday, 31 March 2016 at 13:39:25 UTC, ixid wrote:
> What is going on with UFCS and foreach?
>
> foreach(i;0..5).writeln;
This is not UFCS; it is calling writeln on module scope. See
http://dlang.org/spec/module.html#module_scope_operators
Your code is semantically identical with
foreach (i; 0 .. 5)
{
.writeln; // module scope operator!
}
Furthermre because there is no local variable writeln that could
be confused with the imported function, the code is identical with
foreach (i; 0 .. 5)
{
writeln;
}
> This prints five line breaks.
>
> foreach(i;0..5).i.writeln;
>
> This will not compile.
It does not compile because i is not an identifier at module
scope. i is a local variable and a hypothetical i at module scope
(accessible via .i) is not declared, therefore this is an error.
> foreach(i;0..5).writeln(i);
>
> This writes out 1 to 4 on separate lines. Is this supposed to
> work? I thought a.b would be rewritten to b(a) with UFCS but
> writeln(foreach(i;0..5)) is nonsensical and does not compile
> and should be the same as foreach(i;0..5).writeln;
It does rewrite. But only if there is an expression beforehand
the dot. Here it just isn't. The "foreach (i; 0 .. 5)" is not a
complete expression.
More information about the Digitalmars-d-learn
mailing list