SORU
9 ŞUBAT 2011, ÇARŞAMBA


Üç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
9 ŞUBAT 2011, ÇARŞAMBA


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/

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • AmazonWireless

    AmazonWirele

    8 EYLÜL 2010
  • SDSARG3

    SDSARG3

    14 Mart 2009
  • Sean Murphy

    Sean Murphy

    4 ŞUBAT 2009