Estoy tratando de evitar construcciones como esta:
val result = this.getClass.getSimpleName
if (result.endsWith("$")) result.init else result
Ok, en este ejemplo, la rama then
y else
es simple, pero puedes crear imágenes complejas. Construí lo siguiente:
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)
}
Definido eso, puedo reemplazar el ejemplo simple anterior con:
this.getClass.getSimpleName is {s: String => s.endsWith("$")} ? {s: String => s.init} :: {s: String => s}
Pero, ¿cómo puedo deshacerme del s: String =>
? Quiero algo como eso:
this.getClass.getSimpleName is {_.endsWith("$")} ? {_.init} :: {identity}
Supongo que el compilador necesita material adicional para inferir tipos.
HasIs
,IsWithCondition
,ConditionAndTrueCase
clases que se acumularían partes de la expresión de izquierda a derecha.)?
antes de cualquier otro carácter alfanumérico como nombre de método first char y a:
para asociatividad izquierda. Así que tengo que repensar los nombres de los nuevos métodos para que la inferencia de tipos funcione de izquierda a derecha. ¡Gracias!Respuestas:
Podemos combinar ¿Cómo definir un operador ternario en Scala que conserva los tokens iniciales? con la respuesta a ¿Opción envolver un valor es un buen patrón? Llegar
¿Es esto adecuado para sus necesidades?
fuente
val
para una siguienteif
declaración: hágalo inteligible en una línea, tal como uno lo tiene en mente.Del blog Lambda de Tony Morris :
fuente
then
yelse
.if(c) p else q
enfoque ... la falta de apoyos que me hace un toque incómodo pero eso es sólo una cosa de estiloLa respuesta de Rex Kerr expresada en Scala básica:
aunque no estoy seguro de qué parte de la construcción if-else desea optimizar.
fuente
if then else
lenguaje ternario de una línea , pero de hecho es una forma inteligible de resolver.Dado que las construcciones if-else en Scala devuelven un valor, puede usar esto
Más información: https://alvinalexander.com/scala/scala-if-then-ternary-operator-cookbook-examples
fuente
Dado que: por sí solo no será un operador válido a menos que esté de acuerdo con escapar siempre con tics inversos
:
, puede ir con otro carácter, por ejemplo, "|" como en una de las respuestas anteriores. ¿Pero qué tal Elvis con perilla? ::Por supuesto, esto nuevamente no funcionará si sus valores son listas, ya que tienen :: operador ellos mismos.
fuente