Quy tắc cho điều này được xác định trong phần 8.5 "Pattern Matching Anonymous Functions" của Đặc tả ngôn ngữ Scala. Nếu sử dụng một hàm ẩn danh với đối sánh mẫu, loại phải được cung cấp một phần. Bạn làm điều đó bằng cách nói loại là (Double, Double) => Double
, là viết tắt của Function2[Double, Double, Double]
.
Bây giờ là:
Nếu loại dự kiến là scala.Function k [S1,…,Sk, R]
, khái niệm được đưa đến là tương đương với chức năng ẩn danh:
(x1:S1,…,xk:Sk) => (x1,…,xk) match {
case p1 => b1 … case pn => bn
}
Vì vậy, không có vấn đề gì arity chức năng của mình, khớp mẫu được chuyển qua một bộ tham số của hàm, do đó bạn có thể sử dụng cú pháp trình trích xuất tuple thông thường.
Vì vậy, ví dụ của bạn là viết tắt của
val div: (Double, Double) => Double = (a, b) => (a, b) match {
case (x, y) if y != 0 => x/y
}
hoặc
val div = (a: Double, b: Double) => (a, b) match {
case (x, y) if y != 0 => x/y
}
Các đặt tên các thông số vắt x
và y
tùy thuộc vào trí tưởng tượng của bạn. Bạn quyết định cách gọi các phần tử kết quả của bộ giải nén, bạn cũng có thể viết case (foo, bar) => ...