// Boolean expressions need to resolve to either true or false, as no
// implicit conversions are supported.
I'm sure they have good reason for this, does anyone know of the rationale? I think I'd miss patterns like `if (arr.length) { ... }` // Boolean expressions need to resolve to either true or false, as no
// implicit conversions are supported.
I'm sure they have good reason for this, does anyone know of the rationale? I think I'd miss patterns like `if (arr.length) { ... }`At least for this particular example, dart supports an 'isNotEmpty' property on all iterables[0], so it'd just be this:
if (arr.isNotEmpty) { ... }
The core libraries support a lot of useful properties like that.[0] https://api.dartlang.org/apidocs/channels/stable/dartdoc-vie...
With implicit coercion, the programmer must mentally keep track of how values get coerced (are negative numbers truthy? are empty strings? empty lists? empty objects?). Different languages have different answers for all of these things. As a result, I prefer to always be explicit.
If you've never seen the WAT?[1] talk, I suggest watching it. It has some great examples of type coercion gone wrong in Ruby and JS.
The Angular team, for instance, has defined toBool() (which they use in directives like ng-if) like this:
bool toBool(x) {
if (x is bool) return x;
if (x is num) return x != 0;
return false;
}
It treats true and non-zero numbers as true, and everything else (including null) as false. Boolean conversion maps any object o into a boolean. Boolean conversion is defined by the function application
(bool v){
assert(v != null);
return identical(v, true);
}(o)[1] http://blog.sethladd.com/2012/02/booleans-in-dart.html "The only value that is true is the boolean value true. [...] In a boolean context, everything that is not true is converted to false."
The reason it's defined this way is for efficient compilation to JavaScript. Control-flow constructs don't have to perform a type-check, just a null check (which can be left out in cases due to null propagation).
I rather like that you're forced to be explicit. Often, the (hidden) conversion is a source of bugs or confusion.