2012-01-07 22 views
20

Các scala hướng dẫn nói rằng Int 's thêm hoạt động thực sự là một lời gọi phương thức: 1+1 nghĩa 1.+(1)Nhầm lẫn bởi các định nghĩa điều hành của Int trong Scala

Nhưng khi tôi nhìn vào mã nguồn của Int.scala, dường như các phương pháp sẽ chỉ in một thông báo lỗi. Bất cứ ai có thể giải thích cho tôi cách hoạt động này?

def +(x: Int): Int = sys.error("stub") 

Trả lời

25

Int là value class, có phần hơi khác so với các lớp khác. Không có cách nào để thể hiện sự bổ sung nguyên thủy trong scala mà không đi vào một định nghĩa đệ quy. Ví dụ, nếu định nghĩa của + là,

def +(x: Int): Int = this + x 

Sau đó gọi + sẽ gọi + mà sẽ gọi + mà ...

Scala cần phải biên dịch các phương pháp trên lớp giá trị vào các mã java byte bổ sung/subtraction/etc.

Trình biên dịch không biên dịch + vào bytecode java để bổ sung, nhưng tác giả thư viện scala đã viết Int.scala với các phương thức sơ khai để làm cho nó trở thành tệp nguồn scala hợp lệ. Những phương thức sơ khai đó không bao giờ thực sự được gọi.

7

Khi triển khai nói, phương pháp đó là sơ khai. Rõ ràng việc thực hiện nó được cung cấp bởi trình biên dịch Scala khi mã được biên dịch, bởi vì int + int là một hoạt động nguyên thủy và ngôn ngữ Scala không có bản gốc - chỉ trình biên dịch biết về các nguyên thủy trên JVM.

7

Điều quan trọng là phải nhận ra rằng các toán tử là các phương thức như là cách mà một người tương tác với ngôn ngữ. Những thứ như + trên Int hoạt động giống như bất kỳ phương pháp nào khác trong Scala, thay vì là thứ gì đó phát theo quy tắc của riêng họ.

Tuy nhiên, ở cấp thực hiện , chúng hoàn toàn không có phương pháp: các lớp chỉ có JVM có phương thức và lớp con AnyVal không phải là các lớp liên quan đến JVM. Không ngạc nhiên, ở cấp độ triển khai, chúng hoạt động chủ yếu giống như các nguyên thủy Java.

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