Estou tentando evitar construções como esta:
val result = this.getClass.getSimpleName
if (result.endsWith("$")) result.init else result
Ok, neste exemplo o ramo then
e else
são simples, mas você pode imaginar os complexos. Eu construí o seguinte:
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 isso, posso substituir o exemplo simples acima por:
this.getClass.getSimpleName is {s: String => s.endsWith("$")} ? {s: String => s.init} :: {s: String => s}
Mas como posso me livrar do s: String =>
? Eu quero algo assim:
this.getClass.getSimpleName is {_.endsWith("$")} ? {_.init} :: {identity}
Acho que o compilador precisa de material extra para inferir tipos.
HasIs
,IsWithCondition
,ConditionAndTrueCase
classes que iria construir partes da expressão da esquerda para a direita.)?
antes de qualquer outro caracter de alfanum como um nome de método primeiro char e a:
para associatividade à esquerda. Portanto, tenho que repensar os novos nomes de métodos para fazer a inferência de tipo funcionar da esquerda para a direita. obrigado!Respostas:
Podemos combinar Como definir um operador ternário em Scala que preserva os tokens iniciais? com a resposta para Option wrapping a value um bom padrão? para obter
Isso é adequado para suas necessidades?
fonte
val
para umaif
instrução seguinte : Faça-o inteligível em uma linha, como se tivesse em mente.Do Blog Lambda de Tony Morris :
fonte
then
eelse
.if(c) p else q
abordagem ... a falta de aparelho me deixa um pouco desconfortável, mas isso é apenas uma coisa de estiloResposta de Rex Kerr expressa em Scala básico:
embora eu não tenha certeza de qual parte da construção if – else você deseja otimizar.
fonte
if then else
idioma ternário de uma linha , mas é realmente uma maneira inteligível de resolver.Visto que as construções if-else em Scala retornam um valor, você pode usar este
Mais informações: https://alvinalexander.com/scala/scala-if-then-ternary-operator-cookbook-examples
fonte
Uma vez que: por si só não será um operador válido a menos que você esteja ok em sempre escapar dele com tiques
:
, você pode escolher outro caractere, por exemplo, "|" como em uma das respostas acima. Mas que tal Elvis com cavanhaque? ::É claro que isso novamente não funcionará se seus valores forem listas, já que eles próprios têm :: operador.
fonte