Coolio. I should pay a visit to druntime.. sometime. :)
On 12/12/10, Jonathan M Davis <jmdavisp...@gmx.com> wrote: > On Saturday 11 December 2010 19:00:55 Jonathan M Davis wrote: >> 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. > > On reflection, I should have used the name ptr instead of array, since that > _is_ > its actual name. It slipped my mind I guess... > > - Jonathan M Davis >