string <-> null/bool implicit conversion

Steven Schveighoffer via Digitalmars-d digitalmars-d at puremagic.com
Thu Aug 20 10:50:11 PDT 2015


On 8/20/15 12:45 PM, "=?UTF-8?B?Ik3DoXJjaW8=?= Martins\" 
<marcioapm at gmail.com>\"" wrote:
> Hi!
>
>
> string a = "";
> string b;
>
> writeln(a ? "a" : "null");
> writeln(b ? "b" : "null");
>
>
> This program outputs:
> a
> null
>
>
>
> What?
>
> I suppose this is by design, but are there any plans to deprecate this?

The "truthiness" of an array says it's true ONLY if both the pointer and 
length are 0.

Yes, by design, and no, it won't be deprecated. In fact it was 
deprecated, but was reverted by the language designer as too costly in 
terms of code breakage.

The main reason why it caused issues is this nice idiom:

if(auto arr = someFunction())
{
    // use arr
}

This would HAVE to be split out to two statements, and the arr variable 
would be scoped outside of the if statement.

> Having 2 empty strings evaluate differently is very unintuitive and
> error-prone, in my opinion.

Very true. Not much we can do about it. For now, the best thing to do is 
always compare arrays to null instead of simply if(arr):

if(arr != null)

Alternatively, but a little more ugly, is to check the length:

if(arr.length)

-Steve


More information about the Digitalmars-d mailing list