2009-10-21 18 views

Trả lời

3

a mailing list thread nơi Martin đã trả lời:

Nó tương ứng với JVM. Bạn có thể bỏ qua khởi tạo trường nhưng không khởi tạo biến cục bộ. Bỏ qua các khởi tạo biến cục bộ có nghĩa là trình biên dịch phải có khả năng tổng hợp một giá trị mặc định cho mọi kiểu. Đó không phải là dễ dàng như vậy khi đối mặt với các thông số kiểu, chuyên môn, v.v.

Khi ép về làm thế nào có hoặc nên có bất kỳ sự khác biệt giữa các trường và người dân địa phương trong vấn đề Scala tổng hợp các giá trị mặc định, ông tiếp tục nói:

Về bytecode có IS một rõ ràng Sự khác biệt. JVM sẽ khởi tạo các trường đối tượng theo mặc định và yêu cầu các biến cục bộ được khởi tạo một cách rõ ràng. […] Tôi không chắc liệu chúng ta có nên phá vỡ một nguyên tắc hữu ích của Java (người dân địa phương phải được khởi tạo trước khi được sử dụng) hay không, hay chúng ta nên đi chiều dài đầy đủ và giới thiệu việc kiểm tra khởi tạo dựa trên luồng như trong Java. Đó sẽ là giải pháp tốt hơn, IMO, nhưng sẽ yêu cầu công việc quan trọng về mặt kỹ thuật và thực hiện. Đối mặt với những lựa chọn bản năng tự nhiên của tôi là không làm gì cả cho bây giờ :-)

Vì vậy, nếu tôi hiểu đúng, trình biên dịch Scala không thực sự tổng hợp các giá trị mặc định cho các lĩnh vực đối tượng, nó tạo ra bytecode rằng lá JVM để xử lý điều này.

Theo SI-4437 đã có thỏa thuận từ Martin thực sự xác nhận mẫu null.asInstanceOf[T] trong thông số ngôn ngữ, dường như thiếu khả năng hỗ trợ thay thế tốt hơn trong các hạn chế hiện có.

8

này được định nghĩa trong phần 4.2 của Scala Language Specification (nghiêng của tôi)

Một định nghĩa biến var x: T = _ có thể chỉ xuất hiện là thành viên của mẫu. Nó giới thiệu một lĩnh vực có thể thay đổi với kiểu T và một giá trị ban đầu mặc định

này, tất nhiên, không trả lời các tại sao này nên như vậy!

+4

Vậy tại sao phải như vậy? – Raman

0

Đây là ít nhất một trường hợp sử dụng mà tôi vừa phát hiện ra. Khi đó superclass khởi tạo các biến thành viên thông qua sự phản chiếu nó có thể thực sự khởi tạo một biến lớp con thành viên. Tuy nhiên, nếu một lớp con cũng khởi tạo biến thành viên với một giá trị, thì điều này sẽ có tác dụng ghi đè lên giá trị mà lớp cha đã cho nó. Điều này có thể tránh được bằng cách khởi tạo biến thành viên lớp con với dấu gạch dưới. Đây là lý do tại sao các đặc tả ngôn ngữ nói về việc cho biến một hàm getter trả về giá trị hiện tại xa hơn một chút so với câu được trích dẫn trong câu của oxbow_lake.

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