On Wed, 03 Aug 2011 14:26:54 -0400, simendsjo <simend...@gmail.com> wrote:

Schveighoffer also states it is as designed.
But it really doesn't behave as one (at least I) would expect.
So in essence (as bearophile says), "is null" should not be used on arrays.

I was bitten by a bug because of this, and used "" intead of "".idup to avoid this, but given D doesn't distinguish between empty and null arrays, this doesn't feel very safe now..

I would recommend against depending on the difference between null and not-null-but-empty arrays. But in any case, "".idup is mainly pointless, there is never a need to idup a string, since it's already immutable (and therefore can be passed wherever you need it).

In the code in question I have a lazy initialized string. The problem is that I would see if it has been initialized, but an empty string is also a valid value. Because I shouldn't check for null, I now have to add another field to the struct to see if the array has been initialized. This feels like a really suboptimal solution.

Where is it that you need to use idup? I think you may be using that without need (or if you are using code that violates immutability, that code is incorrect), but I don't know what your code looks like so I might be wrong.

In any case, there may be a better way to do what you want, without the extra field.

At the very least, here is a function that can help you:

myIdup(string s)
{
   return s.length == 0 ? "" : s.idup;
}

Note that this kind of thing *ONLY* works for strings, because string literals are not null. For normal arrays, I wouldn't expect this to work.

-Steve

Reply via email to