Toán tử @ của Scala làm gì?
Ví dụ, trong bài đăng trên blog Xử lý ngôn ngữ chính thức trong Scala, Phần 2 có một cái gì đó như thế này
case x @ Some(Nil) => x
Toán tử @ của Scala làm gì?
Ví dụ, trong bài đăng trên blog Xử lý ngôn ngữ chính thức trong Scala, Phần 2 có một cái gì đó như thế này
case x @ Some(Nil) => x
Câu trả lời:
Nó cho phép một người liên kết một mô hình phù hợp với một biến. Hãy xem xét những điều sau đây, ví dụ:
val o: Option[Int] = Some(2)
Bạn có thể dễ dàng trích xuất nội dung:
o match {
case Some(x) => println(x)
case None =>
}
Nhưng nếu bạn muốn không phải là nội dung của Some
, nhưng tùy chọn riêng của mình? Điều đó sẽ được thực hiện với điều này:
o match {
case x @ Some(_) => println(x)
case None =>
}
Lưu ý rằng @
có thể được sử dụng ở mọi cấp độ, không chỉ ở cấp cao nhất của kết hợp.
_*
). Nhưng có lẽ điều này đã được làm rõ trên một phiên bản mới hơn của thông số kỹ thuật.
@
với Some(_)
, nhưng thay vào đó nếu bạn muốn khớp với nội dung của Some
, nhưng vẫn đề cập đến chính Một số, ví dụ case x @ Some(7) => println(x)
. Theo tôi giải thích, nó case x @ Some(_)
chỉ là một phiên bản dài dòng hơn case x: Some
.
case x: Some
không tự làm việc. Bạn phải sử dụng case x: Some[_]
, không kém phần dài dòng
@
có thể được sử dụng để liên kết một tên với một mẫu phù hợp thành công hoặc mô hình con. Các mẫu có thể được sử dụng trong khớp mẫu, phía bên trái của <-
in để hiểu và phá hủy các giả định.
scala> val d@(c@Some(a), Some(b)) = (Some(1), Some(2))
d: (Some[Int], Some[Int]) = (Some(1),Some(2))
c: Some[Int] = Some(1)
a: Int = 1
b: Int = 2
scala> (Some(1), Some(2)) match { case d@(c@Some(a), Some(b)) => println(a, b, c, d) }
(1,2,Some(1),(Some(1),Some(2)))
scala> for (x@Some(y) <- Seq(None, Some(1))) println(x, y)
(Some(1),1)
scala> val List(x, xs @ _*) = List(1, 2, 3)
x: Int = 1
xs: Seq[Int] = List(2, 3)
Cho phép bạn khớp mức cao nhất của mẫu. Thí dụ:
case x @ "three" => assert(x.equals("three"))
case x @ Some("three") => assert(x.get.equals("three")))
case x @ List("one", "two", "three") => for (element <- x) { println(element) }
Nó đặt giá trị của x
mẫu phù hợp. Trong ví dụ của bạn, x
do đó sẽ là Some(Nil)
(như bạn có thể xác định từ một cuộc gọi đến println )