J'essaie d'éviter les constructions comme celle-ci:
val result = this.getClass.getSimpleName
if (result.endsWith("$")) result.init else result
Ok, dans cet exemple, les branches then
et else
sont simples, mais vous pouvez créer des images complexes. J'ai construit ce qui suit:
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)
}
Défini cela, je peux remplacer l'exemple simple ci-dessus par:
this.getClass.getSimpleName is {s: String => s.endsWith("$")} ? {s: String => s.init} :: {s: String => s}
Mais comment puis-je me débarrasser du s: String =>
? Je veux quelque chose comme ça:
this.getClass.getSimpleName is {_.endsWith("$")} ? {_.init} :: {identity}
Je suppose que le compilateur a besoin des éléments supplémentaires pour déduire les types.
HasIs
,IsWithCondition
, desConditionAndTrueCase
classes qui accumulerait parties de l'expression de gauche à droite.)?
avant tout autre caractère alphanum comme nom de méthode, premier caractère et un:
pour l'associativité gauche. Je dois donc repenser les nouveaux noms de méthodes pour que l'inférence de type fonctionne de gauche à droite. Merci!Réponses:
On peut combiner Comment définir un opérateur ternaire dans Scala qui préserve les tokens principaux? avec la réponse à Option enveloppant une valeur un bon modèle? obtenir
Cela répond-il à vos besoins?
la source
val
pour uneif
déclaration suivante : faites-le intelligible en une seule ligne, comme on l'a à l'esprit.Du blog Lambda de Tony Morris :
la source
then
andelse
.if(c) p else q
approche ... le manque d'accolades me met un peu mal à l'aise mais c'est juste une chose de styleRéponse de Rex Kerr exprimée en Scala de base:
même si je ne suis pas sûr de la partie de la construction if – else que vous souhaitez optimiser.
la source
if then else
idiome ternaire d'une seule ligne , mais c'est en effet une manière intelligible de résoudre.Puisque les constructions if-else dans Scala renvoient une valeur, vous pouvez utiliser ceci
Plus d'informations: https://alvinalexander.com/scala/scala-if-then-ternary-operator-cookbook-examples
la source
Puisque: en lui-même ne sera pas un opérateur valide à moins que vous ne vouliez toujours l'échapper avec des graduations inversées
:
, vous pouvez utiliser un autre caractère, par exemple "|" comme dans l'une des réponses ci-dessus. Mais qu'en est-il d'Elvis avec une barbiche? ::Bien sûr, cela ne fonctionnera pas encore si vos valeurs sont des listes, puisqu'elles ont elles-mêmes :: opérateur.
la source