Ich versuche solche Konstrukte zu vermeiden:
val result = this.getClass.getSimpleName
if (result.endsWith("$")) result.init else result
Ok, in diesem Beispiel sind der then
und else
-Zweig einfach, aber Sie können sich komplexe vorstellen. Ich habe folgendes gebaut:
object TernaryOp {
class Ternary[T](t: T) {
def is[R](bte: BranchThenElse[T,R]) = if (bte.branch(t)) bte.then(t) else bte.elze(t)
}
class Branch[T](branch: T => Boolean) {
def ?[R] (then: T => R) = new BranchThen(branch,then)
}
class BranchThen[T,R](val branch: T => Boolean, val then: T => R)
class Elze[T,R](elze: T => R) {
def :: (bt: BranchThen[T,R]) = new BranchThenElse(bt.branch,bt.then,elze)
}
class BranchThenElse[T,R](val branch: T => Boolean, val then: T => R, val elze: T => R)
implicit def any2Ternary[T](t: T) = new Ternary(t)
implicit def fct2Branch[T](branch: T => Boolean) = new Branch(branch)
implicit def fct2Elze[T,R](elze: T => R) = new Elze(elze)
}
Definiert, kann ich das obige einfache Beispiel ersetzen durch:
this.getClass.getSimpleName is {s: String => s.endsWith("$")} ? {s: String => s.init} :: {s: String => s}
Aber wie kann ich das loswerden s: String =>
? Ich möchte so etwas:
this.getClass.getSimpleName is {_.endsWith("$")} ? {_.init} :: {identity}
Ich denke, der Compiler benötigt das zusätzliche Material, um Typen abzuleiten.
HasIs
,IsWithCondition
,ConditionAndTrueCase
Klassen , die Teile des Ausdrucks aufbauen würde von links nach rechts.)?
vor jedem anderen Alphanum-Zeichen als Methodenname erstes Zeichen und a:
für linke Assoziativität. Ich muss also neue Methodennamen überdenken, damit die Typinferenz von links nach rechts funktioniert. Vielen Dank!Antworten:
Wir können kombinieren Wie man einen ternären Operator in Scala definiert, der führende Token bewahrt? mit der Antwort auf Ist Option, die einen Wert umschließt, ein gutes Muster? bekommen
Ist das für Ihre Bedürfnisse angemessen?
quelle
val
für eine folgendeif
Aussage keine temporäre Aussage hatte: Machen Sie es in einer Zeile verständlich, so wie man es sich vorstellt.Aus Tony Morris 'Lambda-Blog :
quelle
then
undelse
-Klausel habe.if(c) p else q
Ansatz gewählt ... das Fehlen von Zahnspangen macht mich ein wenig unangenehm, aber das ist nur eineRex Kerrs Antwort in Scala ausgedrückt:
obwohl ich nicht sicher bin, welchen Teil des if-else-Konstrukts Sie optimieren möchten.
quelle
if then else
, aber es ist in der Tat eine verständliche Art zu lösen.Da if-else-Konstruktionen in Scala einen Wert zurückgeben, können Sie diesen verwenden
Weitere Informationen: https://alvinalexander.com/scala/scala-if-then-ternary-operator-cookbook-examples
quelle
Da: an sich kein gültiger Operator ist, es sei denn, Sie können ihn immer mit Back Ticks umgehen
:
, können Sie ein anderes Zeichen verwenden, z. B. "|" wie in einer der obigen Antworten. Aber wie wäre es mit Elvis mit einem Spitzbart? ::Dies funktioniert natürlich wieder nicht, wenn Ihre Werte Listen sind, da sie selbst den Operator :: haben.
quelle