null == "" is true?
Steven Schveighoffer
schveiguy at gmail.com
Tue Jul 12 22:58:32 UTC 2022
On 7/12/22 4:36 PM, Antonio wrote:
> On Tuesday, 12 July 2022 at 18:56:43 UTC, Paul Backus wrote:
>> On Tuesday, 12 July 2022 at 16:40:38 UTC, H. S. Teoh wrote:
>>> Because an empty string is, by default, represented by an empty slice
>>> of the null pointer.
>>>
>>> Do not rely on this, however; it's possible sometimes to get an empty
>>> string that isn't null, e.g., if you incrementally shrink a slice
>>> over a string until it's empty. In that case, .ptr will not be null,
>>> but the string will still be empty. Always compare strings against ""
>>> rather than null, because the latter may not do what you think it
>>> does sometimes.
>>
>> This is actually 100% reliable when comparing with the `==` operator
>> because two empty strings always compare equal with `==`, regardless
>> of what they point to.
>>
>> string s = "hello";
>> string empty1 = s[0 .. 0];
>> string empty2 = s[1 .. 1];
>> assert(empty1 == null);
>> assert(empty2 == null);
>> assert(empty1 == empty2);
>>
>> The real problem is that `s == null` looks like it does one thing
>> (test for a null pointer) while actually doing something slightly
>> different (test for an empty string).
>
>
> Then:
>
> ```d
> string a = null;
> assert(a is null);
> assert(a == "");
>
> string b = "");
> assert(b !is null);
> assert(b == null);
>
> ```
>
> Honestly, it is difficult to understand for newcomers... there is a
> reason, but there is a reason in javascript for `0 == ''` too
It's not just for `null`. And it's unrelated to what javascript is doing.
```d
string a = "abcabc";
assert(a[0 .. 3] == a[3 .. $])
assert(a[0 .. 3] !is a[3 .. $])
```
The point is, `==` compares *value*, `is` always compares *identity*.
And you cannot override `is`, it must always be predictable. For arrays,
of course, you can't override `==`, but custom types can.
-Steve
More information about the Digitalmars-d-learn
mailing list