On Saturday 11 December 2010 18:18:54 Tomek Sowiński wrote:
> string s = "";
> assert(s);  // ok
> assert(s != null);  // fails
> 
> I guess that's a bug. But which one is right?

A null array and an empty array are essentially the same thing as far as D is 
concerned. I believe that the only difference is whether "is null" returns true 
or not. So, this program

import std.range;
import std.stdio;

void main()
{
    string s = "";

    writefln("[%s]", s);
    writeln(s is null);
    writeln(s == null);
    writeln(s.empty);
    writeln();

    string t = null;

    writefln("[%s]", t);
    writeln(t is null);
    writeln(t == null);
    writeln(t.empty);
}


prints

[]
false
true
true

[]
true
true
true


"==" is _not_  the correct operator to use to check for null anyway. "is" is 
the 
correct operator for that.

This behavior is intended. Arrays are actually something like this under the 
hood:

struct array(T)
{
    T* arr;
    size_t length;
}


By declaring an array to be null, all you're doing is setting arr to null. 
std.range.empty() will check length and ignore arr. "==" will presumably only 
check arr if the length of the two arrays is the same. If they are the same, 
then each element is checked fore equality. But if their length is zero, then 
you don't need to check any elements. By doing something like

assert("" == null)

you're likely creating an array which has whose arr value is non-null (but it's 
not actually part of the array; the memory there is extra capacity which will 
be 
used if/when you append to the array; it avoids extra memory re-allocations 
that 
way) and an array whose arr value is null. Both will have their lengths be 0.

When "is null" is used, it checks that arr is null. If "==" is used, it checks 
whether the elements of the two arrays are the same. Since they have the same 
length, that would mean iterating through all of their elements to verify that 
each element is the same. But since there are no elements in either, no 
elements 
get checked. The fact that the "" array has extra capacity is irrelevant. It's 
not part of the array, just arr. So, the fact that

assert("" != null);

fails is intended. It's a result of how arrays are designed.

- Jonathan M Davis

Reply via email to