foreach UFCS

Adam D. Ruppe via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Thu Mar 31 06:48:27 PDT 2016


On Thursday, 31 March 2016 at 13:39:25 UTC, ixid wrote:
> What is going on with UFCS and foreach?

There's no such thing as UFCS on foreach. UFCS only works on 
variables, not a foreach statement.

> foreach(i;0..5).writeln;

You can add a line break and optional braces there to see what it 
really is:

foreach(i;0..5) {
    .writeln;
}


It is just an ordinary loop calling writeln 5 times. The leading 
dot in D means "look up in the global namespace".

> foreach(i;0..5).i.writeln;

foreach(i; 0 .. 5) {
    .i.writeln;
}

It is trying to look up a name i in global scope, and calling 
writeln on it.

This is why the .name syntax exists: so you can bypass local 
variables with the same name when trying to access a global.

It would compile if you put an `int i;` at the top of your 
module... try it!


> foreach(i;0..5).writeln(i);

foreach(i; 0 .. 5) {
    .writeln(i); // leading . just means call global writeln
}




What you're seeing is similar to the Java hoax where people say 
it supports hyperlinking:

public static void main() {
    http://dlang.org/awesome
}


That compiles, but it isn't a link, it just looks like one at 
first.

It is actually a label, "http:", followed by a comment, 
"//dlang.org....". Two legal things without whitespace that looks 
like something else at first glance.


More information about the Digitalmars-d-learn mailing list