2012-05-11 37 views
7

Tôi đang đọc Scala ở độ sâu bây giờ. Dưới đây là một trích đoạn từ sách:Các kiểu dự báo loại đường phụ thuộc?

Tất cả các loại phụ thuộc vào đường đều là loại dự báo. Một loại phụ thuộc vào đường dẫn foo.Bar được viết lại dưới dạng foo.type#Bar bởi trình biên dịch ...

Trong Scala, tất cả các tham chiếu kiểu đều có thể được viết thành dự án chống thực thể được đặt tên. Loại scala.String là viết tắt của scala.type#String trong đó tên scala dùng để chỉ gói scala và loại String được xác định bởi lớp String trên gói scala.

Rõ ràng, không có lớp scala.String, nhưng tôi không thể tạo lại điều này với Null.

scala> type N = scala.type#Null 
<console>:7: error: type mismatch; 
found : type 
required: AnyRef 
     type N = scala.type#Null 

Vì vậy, câu hỏi của tôi như sau. Các kiểu dự báo kiểu phụ thuộc vào đường dẫn? Nó chỉ là đại diện trình biên dịch bên trong hoặc có thể được thể hiện trong mã scala?

Trả lời

8

Dưới đây là một phiên REPL nhanh chóng trong đó khẳng định những gì Josh đã viết,

scala> class Foo { type T = String } 
defined class Foo 

scala> val foo = new Foo 
foo: Foo = [email protected] 

scala> implicitly[foo.type#T =:= foo.T] 
res0: =:=[foo.T,foo.T] = <function1> 

Vấn đề với scala.type#Null dụ của bạn là tiền tố scala là một tiền tố gói chứ không phải là một định danh ổn định của một giá trị. Có thể cho rằng nó phải là thứ hai, nhưng không may là nó không ... đó là sự không phù hợp kéo dài giữa ngữ nghĩa của các gói Scala và các đối tượng Scala (theo nghĩa các mô-đun).

+0

Nhưng theo SLS §3.1 'Đường dẫn là một trong những điều sau đây ... p.x trong đó p là đường dẫn và x là thành viên ổn định của p. Thành viên ổn định là gói hoặc ... Một định danh ổn định là một đường dẫn kết thúc bằng một định danh '' 'scala.Null' là số nhận dạng ổn định. Đúng? – 4e6

+0

Không, tất cả các định danh ổn định là các giá trị hoặc gói: 'scala.Null' chỉ định một loại không phải là giá trị. 'scala' là một định danh ổn định nhưng, như bạn đã quan sát, là một gói chứ không phải là một đối tượng, hành vi của nó wrt kiểu singleton tạo thành trong toán tử' .type' khác với ví dụ 'foo' mà tôi đưa ra trong câu trả lời của mình. –

+0

Ồ, bây giờ, cuối cùng tôi thấy đó là tất cả về hành vi '.type'. Phải mất rất nhiều thời gian để hiểu nó. Cảm ơn bạn rất nhiều :) – 4e6

Các vấn đề liên quan