On Tuesday, 2 December 2014 at 22:02:23 UTC, H. S. Teoh via
Digitalmars-d wrote:
2) OK, so the conclusion is that unqualified scoped imports are
dangerous, right? Alright, let's see what happens when we use
qualified
imports:
// mod.d
module mod;
struct S {
// Use a fully-qualified import.
// We place it in the body of S because S's methods
// repeatedly needs it -- after all, DRY is good, right?
import std.format : format;
void method1(string fmt) {
writeln(format(fmt, ... ));
}
void method2() {
auto s = format("abc %s def", ...);
...
}
}
// main.d
module main;
import mod; // we need the definition of S
void format(S s) {
... /* do something with s */
}
void main() {
S s;
s.format(); // UFCS -- should call main.format(s), right?
}
Wrong. That last line in main() actually calls
std.format.format. Why?
Because in mod.d, the `import std.format : format` declaration
actually
pulls in std.format.format into the symbol table of S,
therefore,
S.format now refers to std.format.format. This, therefore,
hijacks the
intended call to main.format.
This is: https://issues.dlang.org/show_bug.cgi?id=13808
Surely this can't be intended behaviour? It seems its imported
publically instead of privately, so that it gets "reexported" to
outside users of the struct. If so, I don't think we should add
workarounds to std.datetime or any other places where this could
occur.