spir wrote:
On Mon, 22 Nov 2010 10:14:03 +0100
Don <nos...@nospam.com> wrote:

Tomek Sowiński wrote:
Don <nos...@nospam.com> napisał(a):

The efficiency issues are important, but are not the primary motivation.
toString() is just wrong. The idea that there is ONE AND ONLY ONE textual representation of an object, is, frankly, idiotic.
I always thought of toString() as an aid in debugging, where having one and only way to print out an object makes sense.
It isn't just used in debugging. It's used for writefln.
But even for debugging, it doesn't work.

If I have a struct:

struct Foo
{
    Complex!(double) val;
}

and, for debugging purposes, I want to write 'val' to 10 decimal places.
How do I do that?

I agree with you. toString lacks flexibility in some (not very common but 
relevant) cases, that would be brought by an optional format specifier. I would 
enjoy beeing able to write this with toString, instead of a custom text() 
method:

struct Complex {
    float r,i;
    string text(string numberFormat="%.3f") {
        string outFormat = format("%s+%sj", numberFormat,numberFormat);
        return format(outFormat, this.r,this.i);
    }
}
void main () {
    auto c = Complex(1.11111,3.333333333);
    writeln(c.text());
    writeln(c.text("%.7f"));
}
==>
1.111+3.333j
1.1111100+3.3333333j


But, to be fair, does this have anything to do with the current <writeTo vs 
toString> debate?
The only actual point of said debate is efficiency.

The debate was triggered by me saying (in Bugzilla) that BigInt would not provide a parameterless toString(), because I can't implement it.
Instead, in BigInt, I provided a function:
void toString( void delegate(const(char)[]) sink, string format);

which solves the formatting issue, as well as the performance issue.

I'm certainly open to other ways of solving the problem. But
string toString();
doesn't seem adequate for the task.

Reply via email to