5 ms·
I see two issues with the ternary operator. One, the syntax is much less readable, and two, the consequent and alternate are both single expressions, so you ca
by coderzach 10y ago
I see two issues with the ternary operator. One, the syntax is much less readable, and two, the consequent and alternate are both single expressions, so you can't do something like:
x = if(something) {
a = foo();
baz(a);
} else {
b = bar();
baz(b);
}
- heywire 10y agoI've always read ternary statements to myself as a question. some_condition ? this : that some_condition? then this, otherwise that Typing this, I realize how hard it is to explain without speaking it :)
- lawpoop 10y agoIs the color red? If so, this; otherwise, that. It's a little tricky, because in the above, the `if` keyword appears after the question mark. Is the color red? Yes-- this: no-- that. Trying to make a parsimonious English sentence while maintaining the syntax elements : P
- kbutler 10y ago> some_condition ? this : that Just read it as: IF some_condition THEN this ELSE that
- junke 10y agoYou compute baz in both branches, you can refactor. x = baz(if (something) foo() else bar())
- tacostakohashi 10y agoIf you insist on the assignments: x = something ? ((a=foo()), baz(a)) : ((b = bar()), baz(b)); Otherwise: x = something ? baz(foo()) : baz(bar());
- vertex-four 10y agoa and b have to be defined before the statement containing the terniary expression here. And the point is that you can embed arbitrary multi-statement logic in your if expressions in Rust in the same way you'd do it anywhere else.
- kazinator 10y agoIt should work in GNU C: x = (something) ? ({ a = foo(); baz(a) }) : ({ b = bar(); baz(b); }); However, since all your forms are actually expression statements, we can happily just use the ISO C comma operator: x = (something) ? (a = foo(), baz(a)) : (b = bar(); baz(b)); If C provided operators for iteration, selection and for binding some variables over a scope (that scope consisting of an expression), everything would be cool. E.g. fantasy while loop: x = (< y 0) ?? y++ : y; // evaluate y++ while (< y 0), then yield y. Variable binding: x = let (int x = 3, double y = 3.0) : (x++, x*y); The problem is that some things can only be done with statements. The ternary operator is not actually lacking anything; with the comma operator, multiple expressions can be evaluated. What's lacking is the vocabulary of what those expressions can do.