opDispatch shadowing toString - feature or bug?
Damian Ziemba
nazriel at driv.pl
Thu Sep 1 15:09:56 PDT 2011
On Thu, 01 Sep 2011 13:59:29 +0200, Timon Gehr wrote:
> static assert(isInputRange!Test);
> static assert(isInputRange!Test2);
>
> toString is not shadowed, but the implementation of writeln assumes that
> your types are an InputRange (they provide, by the means of opDispatch,
> front(), empty() and popFront())
>
> The fact that writeln([]); prints a new line instead of "[]" is a bug
> that has already been taken care of in a pull request afaik.
>
> This specific problem can be solved by making your types not follow the
> InputRange interface, by putting an appropriate constraint on your
> opDispatch.
>
>
> import std.stdio;
>
> struct Test
> {
> string opDispatch( string key )() if(key!="popFront") {
> return "I am dispatching in struct!";
> }
>
> string toString()
> {
> return "I am Test struct!";
> }
> }
>
> class Test2
> {
> string opDispatch( string key )() if(key!="popFront") {
> return "I am dispatching in class!";
> }
>
> string toString()
> {
> return "I am Test class!";
> }
> }
>
> void main()
> {
> Test test = Test();
> writeln ( test.s ); // I am dispatching in struct! writeln
( test.s()
> ); // I am dispatching in struct! writeln ( test ); //I am Test
struct!
>
> Test2 test2 = new Test2();
> writeln ( test2.s ); // I am dispatching in class! writeln
( test2.s()
> ); // I am dispatching in class! writeln ( test2 ); // I am Test
class!
> }
Yes, this fix the problem.
Hmm, after all its a bit loose of a keyword, becouse I can't use anymore
test.popFront. For example if class acts as a storage device
class Storage
{
string[ string ] vars;
string opDispatch( string key )() if ( key != "popFront" )
{
if ( key in vars ) return vars[ key ];
else return "";
}
string toString() { // implement me
}
}
auto storage = new Storage;
storage.vars["test"] = "I'm a test!";
storage.vars["popFront"] = "I'm a poping around! :D";
writeln( storage.test ); // I'm a test!
writeln( storage.popFront ); // error
Ofcours, in opDispatch I can use empty or front instead of popFront but
it is still loose of one keyword.
Looks like it's a loose I have to take :-)
Thank you very much for reply!
Best regards,
Damian Ziemba
More information about the Digitalmars-d-learn
mailing list