On Mon, 09 Aug 2010 17:35:56 -0700, Jonathan M Davis wrote: > On Monday, August 09, 2010 17:09:03 simendsjo wrote: >> On 10.08.2010 02:09, Jonathan M Davis wrote: >> > On Monday, August 09, 2010 16:59:07 bearophile wrote: >> >> simendsjo: >> >>> Ahem.. :) Yes, I did miss your answer! How I got fooled by the >> >>> preview pane and never noticed the scrollbar. >> >> >> >> No problem, it happens, don't worry. >> >> >> >>> I cannot see how your other bug report relates to this though. >> >> >> >> My other bug report is about this line in your code: >> >> if (delimiter == null) >> >> >> >> I don't like it :-) >> >> >> >> Bye, >> >> bearophile >> > >> > Why, because it should be >> > >> > if(delimiter is null) >> > >> > >> > or just >> > >> > if(!delimiter) >> > >> > >> > - Jonathan M Davis >> >> Hehe.. You're a bit beyond my D level right now. At least I now know >> null == false and you can do reference is null :) > > IIRC, you're not really supposed to do "delim == null" but rather us > "delim is null" or shorten to to just "!delim". Why, I don't recall off > the top of my head, but it might be because "delim == null" would be > calling Object.opEquals(), and there's no need for that function call > (though fortunately "delim == null" translates to Object.opEquals(delim, > null) rather than delim.opEquals(null) which avoids issues where the lhs > is null and causes it to go boom). > > In either case, for null checks, I'd suggest either just using the > reference by itself or to explictly use "is null" if you want the extra > clarity.
No, using 'is' won't work. Check this out: int[] a; assert (a == null); assert (a is null); a = new int[10]; a.length = 0; assert (a == null); assert (a !is null); The thing is, '==' tests whether two arrays are equal, that is, that they are equally long and that their elements are equal. Any empty array is equal to null -- in fact, in this context 'null' is just a way of denoting an empty array that doesn't point to any particular memory block (i.e. hasn't been initialised yet). // This is what '==' does bool mimicEquals(int[] a, int[] b) { if (a.length != b.length) return false; foreach (i; 0 .. a.length) if (a[i] != b[i]) return false; return true; } 'is', on the other hand, tests whether two arrays are identical, i.e. that they have the same length and *refer to the same piece of memory*. // This is (sort of) what 'is' does bool mimicIs(int[] a, int[] b) { return (a.ptr == b.ptr && a.length == b.length); } -Lars