Üçlü Operatör Benzer ?:
Bu gibi yapıları önlemek için çalışıyorum:
val result = this.getClass.getSimpleName
if (result.endsWith("$")) result.init else result
Tamam, bu örnekte then
else
şube basit, ama karmaşık olanlar için görüntü kullanabilirsiniz.
Aşağıdaki yaptım:
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)
}
Tanımlanmış, yukarıdaki basit örnek değiştirin:
this.getClass.getSimpleName is {s: String => s.endsWith("$")} ? {s: String => s.init} :: {s: String => s}
Ama nasıl s: String =>
kurtulabilirim? Böyle bir şey istiyorum:
this.getClass.getSimpleName is {_.endsWith("$")} ? {_.init} :: {identity}
Derleyici anlaması türleri için ekstra bir şeyler lazım.
CEVAP
Tony Morris' Lambda Blog:
Bu soruyu çok sık duyuyorum. Evet öyle. * *14, yerine if(c) p else q
yazılır.
Bu tercih olmayabilir. Belki de aynı sözdizimi Java ile yazmak istiyorum. Ne yazık ki, yapamazsın. Bu :
geçerli bir tanımlayıcı değil çünkü. , |
korkma! Bu razı olur?
c ? p | q
Daha sonra aşağıdaki kodu gerekir. Call-by-name (=>
) notlar bağımsız haber. Bu değerlendirme doğru strateji Java değişken yeniden yazmak için gereklidir. Bu Java ile yapılması kendisi olamaz.
case class Bool(b: Boolean) {
def ?[X](t: => X) = new {
def |(f: => X) = if(b) t else f
}
}
object Bool {
implicit def BooleanBool(b: Boolean) = Bool(b)
}
İşte bir örnek biz sadece tanımlanan new operatörü kullanılarak:
object T { val condition = true
import Bool._
// yay!
val x = condition ? "yes" | "no"
}
İyi eğlenceler ;)
http://blog.tmorris.net/posts/does-scala-have-javas-ternary-operator/
Soru ve iki nokta üstüste işareti (?: ...
Perl içinde atama koşullu operatör sor...
Java'da üçlü operatör sadece 7 - Java ...
Java'da üçlü operatör vs if/else&; lt ...
Python üçlü koşullu bir operatör var m...