SORU
3 Aralık 2009, PERŞEMBE


Birden çok durumda, maç scala sınıfları

Bazı dava sınıflara karşı eşleştirme yapıyorum ve aynı şekilde iki kasa idare eder. Şöyle bir şey:

abstract class Foo
case class A extends Foo
case class B(s:String) extends Foo
case class C(s:String) extends Foo


def matcher(l: Foo): String = {
  l match {
    case A() => "A"
    case B(sb) | C(sc) => "B"
    case _ => "default"
  }
}

Ama ben bunu yaptığım zaman hata alıyorum:

(fragment of test.scala):10: error: illegal variable in pattern alternative
    case B(sb) | C(sc) => "B"

Ben B ve C tanımından parametrelerini kaldırın çalışma ama nasıl parametreler ile kullanabilir miyim?

CEVAP
3 Aralık 2009, PERŞEMBE


Dize parametreleri değerlerini umurunda değil gibi görünüyor, ve B tedavi etmek istiyor, aynı evde yaşayan, yani:

def matcher(l: Foo): String = {
  l match {
    case A() => "A"
    case B(_) | C(_) => "B"
    case _ => "default"
  }
}

Eğer gerekiyorsa, parametre ayıklamak ve aynı kodu onları tedavi etmelisiniz blok, olabilir:

def matcher(l: Foo): String = {
  l match {
    case A() => "A"
    case bOrC @ (B(_) | C(_)) => {
      val s = bOrC.asInstanceOf[{def s: String}].s // ugly, ugly
      "B("   s   ")"
    }
    case _ => "default"
  }
}

Daha temiz bir yöntem içine faktör olacağını hissediyorum ama

def doB(s: String) = { "B("   s   ")" }

def matcher(l: Foo): String = {
  l match {
    case A() => "A"
    case B(s) => doB(s)
    case C(s) => doB(s)
    case _ => "default"
  }
}

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • GoldgenieOfficial

    GoldgenieOff

    23 Temmuz 2009
  • MobileTechReview

    MobileTechRe

    6 HAZİRAN 2008
  • NYCarspotter

    NYCarspotter

    26 EYLÜL 2011