When D is not nice

Nick Sabalausky a at a.a
Mon Jul 7 19:18:12 PDT 2008


"superdan" <super at dan.org> wrote in message 
news:g4u4t3$1aln$1 at digitalmars.com...
> Koroskin Denis Wrote:
>
>> On Mon, 07 Jul 2008 03:12:27 +0400, superdan <super at dan.org> wrote:
>>
>> > downs Wrote:
>> >
>> >> superdan wrote:
>> >> > Ary Borenszweig Wrote:
>> >> >
>> >> >> Frank Benoit a écrit :
>> >> >>> String concatenation in Java:
>> >> >>>
>> >> >>> "abc " + a + " bla";
>> >> >>>
>> >> >>> where a is an interface ref.
>> >> >>>
>> >> >>> Ported to D, this look like this:
>> >> >>>
>> >> >>> "abc " ~ (cast(Object)a).toString ~ " bla";
>> >> >>>
>> >> >>> This are 3 steps more:
>> >> >>> 1.) explicit cast to Object (interface/class compatibility!)
>> >> >>> 2.) explicit call to toString
>> >> >>> 3.) put additional parentheses
>> >> >>>
>> >> >>> I would be happy if we could remove all three of this annoying
>> >> points.
>> >> >> Exactly the same thought here. Also:
>> >> >>
>> >> >> int i = ...;
>> >> >> char[] x = "You pressed button " + i;
>> >> >>
>> >> >> Oops... doesn't compile. To fix it:
>> >> >>
>> >> >> import std.string;
>> >> >>
>> >> >> int i = ...;
>> >> >> char[] x = "You pressed button " + toString(i);
>> >> >>
>> >> >> But wait, if that piece of code is inside a method of a class, than
>> >> >> (WHY?) it thinks it's the toString() method, so you end up writing:
>> >> >>
>> >> >> import std.string;
>> >> >>
>> >> >> int i = ...;
>> >> >> char[] x = "You pressed button " + std.string.toString(i);
>> >> >>
>> >> >> Those are the cases I find D not nice.
>> >> >
>> >> > yarp i concur. phobos oughtta have a function asStr that converts
>> >> everything to string and concats. then you write:
>> >> >
>> >> > auto x = asStr("You pressed button ", i, " with your pinky toe");
>> >> >
>> >>
>> >> This is also known as std.string.format.
>> >
>> > narp that interprets %s and shit which can quickly become dangerous.
>>
>> No, unlike printf-family functions, writef/std.string.format and other D
>> counterparts *are* type-safe, so you can use %s with strings, ints, 
>> longs,
>> Objects, i.e. with just _anything_.
>
> narp i meant something else. maybe dangerous was not the appropriate word. 
> let's say surprising.
>
> import std.stdio, std.string;
>
> void main()
> {
>    string shit = "I embed a %s thing";
>    // ...
>    writeln(format("innocent formatting string ", shit));
> }
>
> this will fail dynamically. the problem is that any string argument is 
> searched for %. that bad behavior was fixed in writefln but not in 
> string.format. writefln only parses its first string for % shit but not 
> the others. as it should.

If that's true and hasn't been fixed, you should probably submit a bugzilla 
report if you/someone else hasn't already. 





More information about the Digitalmars-d mailing list