Scala doesn’t use the ternary operator:
test ? iftrue : iffalse
preferring to use if:
if (test) iftrue else iffalse
Dan and I (Inigo) were on a long train journey together and decided to see if we could use Scala’s flexible syntax and support for domain-specific languages to implement our own ternary.
Our best shot is:
class TernaryResults[T](l : => T, r : => T) {
def left = l
def right = r
}
implicit class Ternary[T](q: Boolean) {
def ?=(results: TernaryResults[T]): T = if (q) results.left else results.right
}
implicit class TernaryColon[T](left : => T) {
def ⫶(right : => T) = new TernaryResults(left, right)
}
(1+1 == 2) ?= "Maths works!" ⫶ "Maths is broken"
This is pretty close – it’s abusing Unicode support to have a “colon-like” operator since colon is already taken, and it needs to use ?= rather than ? so the operator precedence works correctly, but it’s recognizably a ternary operator, and it evaluates lazily.
