Why is array truth tied to .ptr?

Bill Baxter dnewsgroup at billbaxter.com
Sun Dec 9 17:52:00 PST 2007


Here's a little test program:

void main()
{
     void check(int[] l) {
         if (l) writef("%-10s","true"); else writef("%-10s","false");
         writef("%-10s", (l is null));
         writef("%-10s", (l.length==0));
         writefln;
     }

     int[] list;
     writefln("%-10s%-10s%-10s%-10s",
              " ", "is true","is null","length==0");
     writef("%-10s","initial"); check(list);
     list = new int[10];
     list = null;
     writef("%-10s","nulled"); check(list);

     list = new int[10];
     list.length = 0;
     writef("%-10s", "zeroed"); check(list);
}


and here's the table it generates:

           is true   is null   length==0
initial   false     true      true
nulled    false     true      true
zeroed    true      false     true

Question: which is the bit of information you are more likely interested 
in knowing:

a) whether the array is currently empty.
b) whether the array happens to have a buffer of some unknowable length 
allocated because of a previous history of operations on it.

If you answered a) then we think alike.

So why does the simplest check

     if(array) { ... }

tell us b) ?

In a nutshell,
    if(array)
is synonymous with
    if(array.ptr)
but I believe it makes much more sense for it to be synonymous with
    if(array.length)
since that's the thing you want to be checking 99.9% of the time.

A little while ago I realized I was making the mistake of checking 
if(array) all over my code.  It makes a lot of sense to do that if you 
know Python, since that's how Python works.  But I think Python's way 
makes a lot more sense than D's way.  So it's hard to remember that the 
simple and clear   if(array)  is almost always a bug waiting to happen.


--bb



More information about the Digitalmars-d mailing list