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