Thread overview
Re: Current status of toString in phobos
Nov 18, 2010
Jonathan M Davis
Nov 18, 2010
Matthias Walter
Nov 19, 2010
Don
November 18, 2010
On Wednesday 17 November 2010 19:48:30 Matthias Walter wrote:
> Hi,
> 
> I'm currently using DMD v2.049 with phobos. I found an old discussion about how toString should be designed and how it is supposed to work. As the following code does not print out the number, I wonder what is the
> 
> current status of how to implement a toString function for a struct/class:
> | auto n = BigInt("42");
> | writefln("%s", n);

Object has the function toString(), which you have to override.

Structs have to define toString() as well. However, unlike classes, it's signature must be _exactly_ string toString();  You can't add extra modifiers such as const or nothrow, or it won't work. You _should_ be able to have extra modifiers on it, but it doesn't work at the moment if you do (so I typically end up declaring two toString()s - one with the modifiers and one without - and declare a private method which they both call that has the actual implementation). There's an open bug on it. Once it's fixed, any signature for toString() should work for structs as long as its name is toString() and it returns a string.

As for BigInt, for some reason it doesn't have a normal toString(). Instead, it has one which you pass a delegate and format string to in order to control how it's converted to a string. It's probably useful, but I do think that it should have a normal toString() method as well. I've opened a bug report on it: http://d.puremagic.com/issues/show_bug.cgi?id=5231

And by the way, version 2.050 is the most recent version of dmd, so you might want to grab it.

- Jonathan M Davis
November 18, 2010

On 11/18/2010 12:04 AM, Jonathan M Davis wrote:
> On Wednesday 17 November 2010 19:48:30 Matthias Walter wrote:
> 
>> Hi,
>>
>> I'm currently using DMD v2.049 with phobos. I found an old discussion about how toString should be designed and how it is supposed to work. As the following code does not print out the number, I wonder what is the
>>
>> current status of how to implement a toString function for a struct/class:
>> | auto n = BigInt("42");
>> | writefln("%s", n);
>> 
> Object has the function toString(), which you have to override.
>
> Structs have to define toString() as well. However, unlike classes, it's
> signature must be _exactly_ string toString();  You can't add extra modifiers
> such as const or nothrow, or it won't work. You _should_ be able to have extra
> modifiers on it, but it doesn't work at the moment if you do (so I typically end
> up declaring two toString()s - one with the modifiers and one without - and
> declare a private method which they both call that has the actual
> implementation). There's an open bug on it. Once it's fixed, any signature for
> toString() should work for structs as long as its name is toString() and it
> returns a string.
> 
Okay, so the current way to use toString is still the Java-like way.

> As for BigInt, for some reason it doesn't have a normal toString(). Instead, it
> has one which you pass a delegate and format string to in order to control how
> it's converted to a string. It's probably useful, but I do think that it should
> have a normal toString() method as well. I've opened a bug report on it:
> http://d.puremagic.com/issues/show_bug.cgi?id=5231
> 
I've read the bug comments. Seems as it will take some time until the toString system gets renewed (although I like Don's way, but without the corresponding format/writefln implementation, it is pretty useless). Until then I will have a to use toDecimalString and toHex, I guess.

best regards
Matthias
November 19, 2010
Matthias Walter wrote:
> I've read the bug comments. Seems as it will take some time until the
> toString system gets renewed (although I like Don's way, but without the
> corresponding format/writefln implementation, it is pretty useless).

The bug in format/writefln has now been fixed. Works in svn.


> Until then I will have a to use toDecimalString and toHex, I guess.
> 
> best regards
> Matthias