On Friday, 21 August 2015 at 14:34:49 UTC, Steven Schveighoffer wrote:
On 8/21/15 10:12 AM, Jonathan M Davis wrote:

I know full-well that that's what you're doing, but that's not what your average programmer is going to expect. Anyone not intimately familiar with the ins and outs of D's arrays - or even a D programmer who's not paying really close attention - is likely to think that arr != null is checking whether the array is null - not whether the array is empty. And if I see code like that, I'm going to assume that the programmer who wrote the code really wanted was !is null but either made a mistake or didn't understand the difference between !is and != in this context.

This is a very bad assumption. null is just a name for a pre-defined empty array, perfectly legal to compare with.

Whenever I see "arr is ...", I would consider that to likely be a mistake warranting further investigation. Because an array is synonymous with its elements, not it's pointer. There obviously are cases where the pointer value is important, but very very rarely do you care that an array's pointer *and* it's length are identical. != does not warrant the same scrutiny, because it doesn't care about the pointer value.

Yes, but null is pretty much synonymous with pointers. Almost anyone who sees null is going to be thinking pointers. The way that we treat null with arrays is just plain bizarre. It works, but it's not what anyone coming to the language expects, and I think that explicitly using null to mean anything other than null is just plain error-prone. Yes, using ==/!= to compare an array with null is going to check for empty rather than check the pointer, which is consistent with how it's going to work when comparing with another array which is null, but how many programmers are really going to look at arr == null and think that it's checking whether the array is empty? If they have enough experience in D _and_ they're paying enough attention, then they'll understand what's going on and catch it, but there's no reason to introduce that level of confusion in the first place. IMHO, it's far better to just be explicit about it and do arr.empty - or arr.length != 0 if you don't want to pull in std.array. I see zero benefit in doing arr == null and only an invitation to confuse people - be it someone who doesn't understand all of the intricacies of D's arrays or a developer that's working too late. Using arr.empty just eliminates all of that confusion and makes the code clear.

- Jonathan M Davis

Reply via email to