Để giải thích điều đó, trước hết chúng ta phải giải thích các lớp lồng nhau trong Scala. Hãy xem xét ví dụ đơn giản này:
class A {
class B
def f(b: B) = println("Got my B!")
}
Bây giờ hãy thử một cái gì đó với nó:
scala> val a1 = new A
a1: A = [email protected]
scala> val a2 = new A
a2: A = [email protected]
scala> a2.f(new a1.B)
<console>:11: error: type mismatch;
found : a1.B
required: a2.B
a2.f(new a1.B)
^
Khi bạn khai báo một lớp bên trong một lớp học trong Scala, bạn đang nói rằng mỗi trường hợp của lớp đó có như vậy một phân lớp. Nói cách khác, không có lớp học A.B
nhưng có các lớp học a1.B
và a2.B
và chúng là các lớp khác nhau, vì thông báo lỗi cho chúng tôi biết ở trên.
Nếu bạn không hiểu điều đó, hãy tìm kiếm các loại phụ thuộc vào đường dẫn.
Bây giờ, #
giúp bạn có thể tham khảo các lớp lồng nhau đó mà không hạn chế nó vào một cá thể cụ thể. Nói cách khác, không có A.B
, nhưng có A#B
, có nghĩa là B
lớp lồng nhau là bất kỳ phiên bản nào của A
.
Chúng ta có thể thấy điều này trong công việc bằng cách thay đổi mã trên:
class A {
class B
def f(b: B) = println("Got my B!")
def g(b: A#B) = println("Got a B.")
}
Và cố gắng nó ra:
scala> val a1 = new A
a1: A = [email protected]
scala> val a2 = new A
a2: A = [email protected]
scala> a2.f(new a1.B)
<console>:11: error: type mismatch;
found : a1.B
required: a2.B
a2.f(new a1.B)
^
scala> a2.g(new a1.B)
Got a B.
Nguồn
2012-02-25 13:40:45
"dấu thăng" đôi khi được gọi là "octathrop" (tìm kiếm trên google đã đưa tôi đến trang này). – philwalk
Làm cho [octothorpe hoặc octothorp] (https://en.wikipedia.org/wiki/Number_sign) – smparkes
Các nhà khai thác khác như # + và # - (xem https://github.com/tpolecat/doobie/blob/series /0.4.x/yax/h2/src/main/scala/doobie/h2/H2Transactor.scala)? Có danh sách toàn diện không? –