Saya melakukan pencocokan terhadap beberapa kelas kasus dan ingin menangani dua kasus dengan cara yang sama. Sesuatu seperti ini:
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"
}
}
Tetapi ketika saya melakukan ini saya mendapatkan kesalahan:
(fragment of test.scala):10: error: illegal variable in pattern alternative
case B(sb) | C(sc) => "B"
Saya bisa membuatnya berfungsi dengan menghapus parameter dari definisi B dan C tetapi bagaimana saya bisa mencocokkan dengan parameter?
scala
pattern-matching
timdisney
sumber
sumber
case A(x) | B(x) => println(x)
diizinkan di mana tipex
diatur ke batas atas dalam sistem tipe apa pun yang dihasilkan A (x) dan B (x).Ada beberapa cara yang dapat saya lihat untuk mencapai apa yang Anda inginkan, jika Anda memiliki kesamaan antara kelas kasus. Yang pertama adalah membuat kelas kasus memperluas sifat yang menyatakan kesamaan, yang kedua adalah menggunakan tipe struktural yang menghilangkan kebutuhan untuk memperluas kelas kasus Anda.
Metode tipe struktural menghasilkan peringatan tentang penghapusan yang, saat ini saya tidak yakin bagaimana cara menghilangkannya.
sumber
Yah, itu tidak masuk akal, bukan? B dan C saling eksklusif, jadi sb atau sc terikat, tetapi Anda tidak tahu yang mana, jadi Anda memerlukan logika seleksi lebih lanjut untuk memutuskan mana yang akan digunakan (mengingat bahwa keduanya terikat ke Opsi [String], bukan Sebuah benang). Jadi tidak ada yang didapat dari ini:
Atau ini:
sumber
args match { case Array("-x", hostArg) => (hostArg, true); case Array(hostArg, "-x") => (hostArg, true) }
Namun, saya melihat itu bukan kasus umum dan membuat metode lokal adalah alternatif. Namun, jika alternatifnya nyaman, maka tidak ada gunanya memiliki alternatif case. Sebenarnya, dalam beberapa dialek ML Anda memiliki fitur yang serupa dan Anda masih dapat mengikat variabel, selama (IIRC) karena setiap variabel terikat dengan jenis yang sama pada kedua alternatif.