The Nullity Of strings and Its Meaning

ag0aep6g via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Sun Jul 9 03:32:23 PDT 2017


On 07/09/2017 01:12 AM, kdevel wrote:
> On Saturday, 8 July 2017 at 18:39:47 UTC, ag0aep6g wrote:
>> On 07/08/2017 07:16 PM, kdevel wrote:
> 
>> null is one specific array. It happens to be empty, but that doesn't 
>> really matter. `foo is null` compares with the null array. It doesn't 
>> check for emptiness. Conversion to bool also compares with null. The 
>> concept of emptiness is unrelated.
> 
> But why? What is the intended use of converting a string (or any other 
> dynamic array) to bool?

As I said: I wouldn't mind if it went away. I don't see a strong use 
case that justifies the non-obvious behavior of `if (arr)`. But 
apparently it is being used, and breaking code is a no-no.

As for how it's used, I'd start digging at the link Timon has posted.

> In Issue 17623 Vladimir pointed out, that in the case of strings there 
> may be a need to store an empty D-string which also is a NUL-terminated 
> C-String. It would be sufficient if the ptr-Value would convert for 
> checking if there is a valid part of memory containing the NUL byte.

But just looking at .ptr doesn't tell if there's a '\0'. You'd have to 
dereference the pointer too.

And that's not what Vladimir is getting at. Issue 17623 is about `arr1 
is arr2`, not about conversions to bool like `if (arr)`. It makes sense 
that `null !is ""`. They're not "the same". One place where the 
difference matters is when working with C strings.

Issue 17623 is absolutely valid. But it's much more likely that the spec 
will be changed rather than the implementation.

> Moreover everything I've written about strings is also valid for e.g. 
> dynamic arrays of doubles. Here there are also two different kinds of 
> empty arrays which compare equal but are not identical. I see no purpose 
> for that.

So you'd make `arr1 is arr2` true when they're empty, ignoring a 
difference in pointers. Otherwise, it would still compare pointers. Right?

I don't think that's a good idea, simply because it's a special case.

I noticed that you haven't mentioned `==`. You're probably aware of it, 
but if not we might be talking past each other. So, just to be clear: 
You can also compare arrays with `==` which compares elements. `null == 
""` is true.

>> You only get surprised if you expect that to check for emptiness (or 
>> something else entirely).
> 
> As mentioned I was surprised, that the non-nullity did not pass thru 
> decodeComponent.

decodeComponent doesn't seem to return the same (identical) string you 
pass it, most of the time. Try "foo":

----
void main()
{
     import std.uri;
     string a = "foo";
     auto s = a.decodeComponent;
     assert(s == a); /* passes */
     assert(s is a); /* fails */
}
----

decodeComponent simply gives no promise of preserving pointers. You also 
shouldn't rely on it returning null for a null input, even when it 
currently does that.

>> The spec isn't very clear there. What does "the same array elements" 
>> mean for empty arrays?
> 
> Mathematically that's easily answered: 
> https://en.wikipedia.org/wiki/Universal_quantification#The_empty_set

So "two empty arrays refer to the same elements" is true because 
everything said about the elements of empty arrays is true? Is "two 
empty arrays do *not* refer to the same elements" also true?


More information about the Digitalmars-d-learn mailing list