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ş:
Birden fazla sınıflar arasında nasıl k...
İlan için dezavantajları dava sınıflar...
Scala, nasıl birden fazla kurucular il...
Geçen ruby için birden fazla hata sını...
'birden çok parametre listeleri a...