Wie definieren Sie einen ternären operator, die in Scala, das bewahrt führenden tokens?
Schreibe ich einen code-generator, erzeugt der Scala-Ausgang.
Brauche ich, um zu emulieren einen ternären operator, die in einer solchen Weise, dass die Token im Vorfeld '?' erhalten bleiben.
z.B. konvertieren der Ausdruck c ? p : q
zu c something
. Die einfache if(c) p else q
scheitert meine Kriterien, da es erfordert, dass man if(
vor c
.
Meinem ersten Versuch (noch mit c/p/q wie oben) ist
c match { case(true) => p; case _ => q }
andere option, die ich fand, war:
Klasse ternäre(val g: Boolean => Any) { def |: (b:Boolean) = g(b) } implizite def autoTernary (g: Boolean => Alle): Dreieck = new Dreieck(g)
die es mir erlaubt zu schreiben:
c |: { b: Boolean => if(b) p else q }
Ich mag das Allgemeine Aussehen, die zweite option, aber es ist ein Weg, um es weniger kompliziert?
Dank
- z.B. etwas mit '_' anstelle von b:Boolean wäre schön, aber ich konnte nicht alles richtig funktioniert
- Sehen
BooleanW#?
aus Scalaz: scalaz.googlecode.com/svn/continuous/latest/browse.sxr/scalaz/...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Obwohl die syntax nicht zu bewerten in der erwarteten Reihenfolge-es bindet die bedingte für die erste option!--Sie können Ihre eigenen ternären operator so:
Der trick ist, zu interpretieren
?
als eine Methode, die auf einemMakeIfTrue
Objekt, das bindet die Bedingung, um das Objekt wieder im "echten" Fall. Die daraus resultierendeIfTrue
Objekt verwendet nun die|
Methode als Anforderung zu bewerten, der Zustand, die Rückgabe der gespeicherten wahre option, wenn die Bedingung wahr ist, oder nur bestanden-in einer, wenn es falsch ist.Beachten Sie, dass ich verwendet habe, Sachen wie
=> A
statt nurA
--by-name-Parameter--um nicht den Ausdruck auszuwerten, es sei denn, es ist tatsächlich verwendet werden. Sie werden also nur bewerten die Seite, die Sie wirklich brauchen (wie eine if-Anweisung).Lassen Sie uns in Aktion sehen:
(P. S. um Verwechslungen Zu vermeiden mit dem Schauspieler Bibliothek
?
Sie sollten nennen es etwas anderes wie|?
.)Let ' s keep it simple:
Java:
Scala:
Neben der Einfachheit ist es klar und schnell da: keine Objekte zuweisen, die Sie nicht brauchen, hält der garbage collector aus Gleichung (wie es immer sein sollte) und macht eine bessere Nutzung der Prozessor-caches.
Könnte man so etwas wie das
Dieser code wandelt alle booleschen Wert in einen anonymen Typ, der hat eine Methode namens
?
. Je nach Wert des boolean diese Methode wird entweder zurückTernarySecond
oderTernaryThird
. Sie haben beide eine Methode namens>
gibt der zweite operand ist oder die Dritte beziehungsweise.Ternärer operator fügt meine Verbesserung zu den besten der Rex Kerr ' s und Michel Krämer Implementierungen:
.
Hinweis: die Verbesserung über
if else
ist nicht nur die 6 Zeichen gespeichert. Mit Scala IDE syntax-Einfärbung von Schlüsselwörtern, die gleichen (z.B. lila) fürif
,else
,null
, undtrue
, es ist besser, Kontrast in einigen Fällen, welche nicht durch die syntax-Einfärbung unten, wie aktuell die Darstellung auf dieser Seite):