Apakah mungkin untuk mencocokkan perbandingan menggunakan sistem pencocokan pola di Scala? Sebagai contoh:
a match {
case 10 => println("ten")
case _ > 10 => println("greater than ten")
case _ => println("less than ten")
}
Pernyataan kasus kedua adalah ilegal, tetapi saya ingin dapat menentukan "kapan a lebih besar dari".
scala
pattern-matching
Cocok dengan Teorema
sumber
sumber
case x if x.size > 2 => ...
Jawaban:
Anda bisa menambahkan penjaga, yaitu
if
ekspresi a dan boolean setelah pola:Edit: Catatan bahwa ini adalah lebih dari dangkal yang berbeda untuk meletakkan sebuah
if
setelah itu=>
, karena pola tidak akan cocok jika penjaga tidak benar.sumber
Sebagai jawaban terhadap semangat pertanyaan, yang bertanya bagaimana memasukkan predikat ke dalam klausa pertandingan, dalam hal ini predikat dapat diperhitungkan sebelum
match
:Sekarang, dokumentasi untuk
scala.math.Ordering.compare(T, T)
janji hanya bahwa hasil yang tidak sama akan lebih besar dari atau kurang dari nol . JavaComparable#compareTo(T)
dispesifikasikan mirip dengan Scala. Kebetulan konvensional menggunakan 1 dan -1 untuk nilai-nilai positif dan negatif, masing-masing, seperti implementasi Scala saat ini, tetapi kita tidak dapat membuat asumsi seperti itu tanpa risiko implementasi berubah dari bawah.sumber
compare()
dancompareTo()
tidak menentukan 0, 1, dan -1 sebagai kodomain mereka.Solusi yang menurut saya jauh lebih mudah dibaca daripada menambahkan penjaga:
Catatan:
Ordered.compare
mengembalikan bilangan bulat negatif jika ini kurang dari itu, positif jika lebih besar, dan0
jika sama.Int.signum
kompres output daricompare
ke-1
untuk angka negatif (kurang dari 10),1
untuk positif (lebih besar dari 10), atau0
untuk nol (sama dengan 10).sumber
Sementara semua jawaban di atas dan di bawah dengan sempurna menjawab pertanyaan asli, beberapa informasi tambahan dapat ditemukan dalam dokumentasi https://docs.scala-lang.org/tour/pattern-matching.html , mereka tidak cocok dengan kasus saya tetapi karena jawaban stackoverflow ini adalah saran pertama di Google saya ingin memposting jawaban saya yang merupakan kasus sudut pertanyaan di atas.
Pertanyaanku adalah:
Yang dapat diparafrasekan:
Jawabannya adalah contoh kode di bawah ini:
tautan ke scala fiddle: https://scalafiddle.io/sf/G37THif/2 karena Anda dapat melihat
case xs if n <= 0 => xs
pernyataan tersebut dapat menggunakan n (argumen fungsi) dengan pernyataan penjaga (jika).Saya harap ini membantu orang seperti saya.
sumber