digitalmars.D - toString not working...
- Orgoton (6/6) Jan 15 2007 I have
- Johan Granberg (5/13) Jan 15 2007 Every type does not inherit from object, every class does. As ushort is ...
- Orgoton (9/9) Jan 15 2007 Ok, now I did
- Marcin Kuszczak (19/32) Jan 15 2007 Probably you did:
- Ary Manzana (4/35) Jan 16 2007 That's not very intuitive :-(
- Daniel Keep (11/15) Jan 16 2007 I can think of two ways:
- Frits van Bommel (4/16) Jan 16 2007 I agree that would be a nice thing to have. And it can't really be that
- Leopold Walkling (4/33) Jan 16 2007 This problem only occurs if you import specific modules (std.thread). So...
- Daniel Giddings (11/42) Jan 16 2007 I've found use of format better in many cases as with tuple's the
- Daniel Giddings (58/58) Jan 16 2007 I suppose I should give an example of the matching error:
I have ushort number=1092; char[] text="Some text " ~ number.toString(); it doesn't compile because presumably ushort has no property called "toString" yet on digitalmars.com/d it says that toString is defined on class "object" and every type inherits from this object. Any ideas?
Jan 15 2007
Orgoton wrote:I have ushort number=1092; char[] text="Some text " ~ number.toString(); it doesn't compile because presumably ushort has no property called "toString" yet on digitalmars.com/d it says that toString is defined on class "object" and every type inherits from this object. Any ideas?Every type does not inherit from object, every class does. As ushort is not a class it has no such property. try this code instead; import std.string; toString(number);
Jan 15 2007
Ok, now I did import std.string; ushort number=1092; char[] text="Some text " ~ toString(number); and the compiler claimed that the number of arguments of Object.object.toString() did not match... So, I did char[] text="Some text " ~ std.string.toString(number); and it worked fine. Is this a compiler bug? I did not import object (as it is implicitly done). Or have I some weird compiler configuration?
Jan 15 2007
Orgoton wrote:Ok, now I did import std.string; ushort number=1092; char[] text="Some text " ~ toString(number); and the compiler claimed that the number of arguments of Object.object.toString() did not match... So, I did char[] text="Some text " ~ std.string.toString(number); and it worked fine. Is this a compiler bug? I did not import object (as it is implicitly done). Or have I some weird compiler configuration?Probably you did: char[] text="Some text " ~ toString(number); in class method, so compiler thought you want to refer to Object's toString() method. You should escape current scope of class with '.' (dot). class Test { void method(int number) { char[] text="Some text " ~ .toString(number); } } Above code should work. -- Regards Marcin Kuszczak (Aarti_pl) ------------------------------------- Ask me why I believe in Jesus - http://zapytaj.dlajezusa.pl (en/pl) Doost (port of few Boost libraries) - http://www.dsource.org/projects/doost/ -------------------------------------
Jan 15 2007
Marcin Kuszczak escribió:Orgoton wrote:That's not very intuitive :-( Can't this be fixed? toString methods should be easy to work since they are widely used.Ok, now I did import std.string; ushort number=1092; char[] text="Some text " ~ toString(number); and the compiler claimed that the number of arguments of Object.object.toString() did not match... So, I did char[] text="Some text " ~ std.string.toString(number); and it worked fine. Is this a compiler bug? I did not import object (as it is implicitly done). Or have I some weird compiler configuration?Probably you did: char[] text="Some text " ~ toString(number); in class method, so compiler thought you want to refer to Object's toString() method. You should escape current scope of class with '.' (dot). class Test { void method(int number) { char[] text="Some text " ~ .toString(number); } } Above code should work.
Jan 16 2007
Ary Manzana wrote:That's not very intuitive :-( Can't this be fixed? toString methods should be easy to work since they are widely used.I can think of two ways: 1) Allow for type extensions, or 2) require the use of "this" in front of all members -- hey, it works for Python! :3 The problem here is that if called from an object instance, "this.toString" shadows any global "toString"s. It's not so much a bug above is the best long-term solution to this, as it allows you to more obviously disambiguate what you're trying to say. -- Daniel
Jan 16 2007
Daniel Keep wrote:Ary Manzana wrote:[snip]That's not very intuitive :-( Can't this be fixed? toString methods should be easy to work since they are widely used.I can think of two ways: 1) Allow for type extensions, orabove is the best long-term solution to this, as it allows you to more obviously disambiguate what you're trying to say.I agree that would be a nice thing to have. And it can't really be that hard to implement; it's already done for arrays, why not for other types?
Jan 16 2007
Hello Marcin,Orgoton wrote:This problem only occurs if you import specific modules (std.thread). So if you comment out that line, you can use toString without the dot, this isn't the wanted behavior, right?Ok, now I did import std.string; ushort number=1092; char[] text="Some text " ~ toString(number); and the compiler claimed that the number of arguments of Object.object.toString() did not match... So, I did char[] text="Some text " ~ std.string.toString(number); and it worked fine. Is this a compiler bug? I did not import object (as it is implicitly done). Or have I some weird compiler configuration?Probably you did: char[] text="Some text " ~ toString(number); in class method, so compiler thought you want to refer to Object's toString() method. You should escape current scope of class with '.' (dot). class Test { void method(int number) { char[] text="Some text " ~ .toString(number); } } Above code should work.
Jan 16 2007
I've found use of format better in many cases as with tuple's the compiler can get confused as to which toString variant to use (giving a link error because its trying to compile a call in to toString(bool) on a char[]), and it happily avoids any naming conflicts with the toString of your class. class Test { void method(int number) { char[] text="Some text " ~ format(number); } } Marcin Kuszczak wrote:Orgoton wrote:Ok, now I did import std.string; ushort number=1092; char[] text="Some text " ~ toString(number); and the compiler claimed that the number of arguments of Object.object.toString() did not match... So, I did char[] text="Some text " ~ std.string.toString(number); and it worked fine. Is this a compiler bug? I did not import object (as it is implicitly done). Or have I some weird compiler configuration?Probably you did: char[] text="Some text " ~ toString(number); in class method, so compiler thought you want to refer to Object's toString() method. You should escape current scope of class with '.' (dot). class Test { void method(int number) { char[] text="Some text " ~ .toString(number); } } Above code should work.
Jan 16 2007
I suppose I should give an example of the matching error: import std.stdio; import std.string; struct S(T...) { static assert( T.length > 0 ); T fields; char[] toString() { char[] result = "(" ~ .toString(fields[0]); foreach( f; fields[1..$] ) result ~= "," ~ .toString(f); return result ~ ")"; } } void main() { S!(char[],double) t; writefln( t ); } compiling gives: t.d(12): function std.string.toString (bool) does not match parameter types (char[]) t.d(8): Error: cannot implicitly convert expression this._fields_field_0) of type char[] to char* t.d(22): template instance t.S!(char[],double) error instantiating but using format: import std.stdio; import std.string; struct S(T...) { static assert( T.length > 0 ); T fields; char[] toString() { char[] result = "(" ~ format(fields[0]); foreach( f; fields[1..$] ) result ~= "," ~ format(f); return result ~ ")"; } } void main() { S!(char[],double) t; writefln( t ); } compiles, and correctly gives: (,nan)
Jan 16 2007