Ambil fungsi berikut:
def fMatch(s: String) = {
s match {
case "a" => println("It was a")
case _ => println("It was something else")
}
}
Pola ini cocok dengan baik:
scala> fMatch("a")
It was a
scala> fMatch("b")
It was something else
Yang ingin saya lakukan adalah sebagai berikut:
def mMatch(s: String) = {
val target: String = "a"
s match {
case target => println("It was" + target)
case _ => println("It was something else")
}
}
Ini memberikan kesalahan berikut:
fMatch: (s: String)Unit
<console>:12: error: unreachable code
case _ => println("It was something else")
Saya kira ini karena menurutnya target sebenarnya adalah nama yang ingin Anda tetapkan untuk apa pun inputnya. Dua pertanyaan:
Mengapa perilaku ini? Tidak dapat kasus hanya mencari variabel yang ada dalam lingkup yang memiliki jenis yang sesuai dan menggunakan yang pertama dan, jika tidak ada yang ditemukan, maka perlakukan target sebagai nama untuk pencocokan pola?
Apakah ada solusi untuk ini? Adakah cara untuk mencocokkan pola dengan variabel? Pada akhirnya, seseorang dapat menggunakan pernyataan if yang besar, tetapi kotak korek api lebih elegan.
scala
pattern-matching
match
Henry Henrinson
sumber
sumber
Jawaban:
Yang Anda cari adalah pengenal yang stabil . Di Scala, ini harus dimulai dengan huruf besar, atau diapit oleh backticks.
Keduanya akan menjadi solusi untuk masalah Anda:
Untuk menghindari secara tidak sengaja merujuk ke variabel yang sudah ada di lingkup yang melingkupinya, menurut saya masuk akal bahwa perilaku default untuk pola huruf kecil menjadi variabel dan bukan pengidentifikasi stabil. Hanya ketika Anda melihat sesuatu yang dimulai dengan huruf besar, atau di belakang, Anda perlu menyadari bahwa itu berasal dari lingkup sekitarnya.
sumber
target
adalah nilai (val
), dan bukan variabel (var
). Itu tidak bekerja dengan variabel.Nil
, yang saya yakin adalah alasan sebenarnya.this
sebagai pengenal yang stabil untuk mencocokkan pola dengannya, hanya cara yang tampaknya menggunakan penjaga kesetaraan seperti itucase x if x == this =>
. Mungkin batasan sintaksis, jika tidak maka semantik harus bekerja setidaknya dalamobject
s.