empty arrays and cast(bool): WAT
Timon Gehr
timon.gehr at gmx.ch
Sat Feb 18 19:24:46 PST 2012
On 02/19/2012 03:23 AM, Jonathan M Davis wrote:
> On Sunday, February 19, 2012 03:01:55 Timon Gehr wrote:
>> Why does the following code behave funny?
>>
>> void main(){
>> string x = " "[1..1];
>> writeln(cast(bool)x); // true
>> char[] y = [' '][1..1];
>> writeln(cast(bool)y); // false
>> }
>>
>> Is there any reason for empty arrays to evaluate to true? This is very
>> bug prone.
>
> Because they're not null. _null_ is what evaluates to false, not an empty
> array.
That is my point. It should not be that way. That is utter nonsense. It
is a major wart. (Every literal with a null .ptr evaluates to false,
btw, not just 'null')
> But the fact that == treats null and [] as the same thing _does_
> understandably cloud things a bit.
>
Nothing cloudy about that, that is sane behaviour and I want it to be
consistently carried out everywhere. ('is' can still do a binary
compare, that is what it is designed to do.)
> But
>
> if(arr)
>
> is lowered to
>
> if(cast(bool)arr)
>
> which checks for null, not empty. So, this is fully expected.
No, it is not what is expected, it is what is _observed_. It is almost
certainly just a bug in the implementation and everyone thought it is
part of the language.
Consider this, and then don't tell me it is not a leftover from the
ancient times when dynamic arrays implicitly converted to their .ptr fields:
struct DynArray{
size_t length;
int* ptr;
alias ptr this;
}
void main(){
DynArray a;
int[] b;
writeln(cast(bool)a); // false
writeln(cast(bool)b); // false
a.ptr = new int;
writeln(cast(bool)a); // true
*(cast(int**)&b+1) = new int; // "b.ptr = new int"
writeln(cast(bool)b); // true
}
> If you want to check whether an array is empty, then check whether it's empty, not whether
> it's true.
>
I can't help myself noticing that you always seem to defend the position
that makes the code more verbose.
More information about the Digitalmars-d
mailing list