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.