2013-02-27 35 views

Trả lời

132

Có một vài điều đang diễn ra.

Đầu tiên, Scala cho phép bỏ dấu chấm và dấu ngoặc đơn từ nhiều cuộc gọi phương thức, vì vậy 20 seconds tương đương với 20.seconds() *.

Thứ hai, "chuyển đổi ngầm" được áp dụng. Kể từ 20 là một IntInt không có seconds phương pháp, tìm kiếm biên dịch cho một chuyển đổi ngầm mà phải mất một Int và trả về một cái gì đó mà không có một phương pháp seconds, với việc tìm kiếm bị hạn chế bởi phạm vi của cuộc gọi phương pháp của bạn.

Bạn đã nhập DurationInt vào phạm vi của mình. Vì DurationInt là lớp ẩn với tham số Int, hàm tạo của nó xác định một chuyển đổi ngụ ý Int => DurationInt. DurationInt có phương thức seconds, vì vậy, nó đáp ứng tất cả các tiêu chí tìm kiếm. Do đó, trình biên dịch sẽ ghi lại cuộc gọi của bạn là new DurationInt(20).seconds **.

* Ý tôi là điều này lỏng lẻo. 20.seconds() thực sự không hợp lệ vì phương thức seconds không có danh sách tham số và do đó các số parens phải được bỏ qua trong cuộc gọi phương thức.

** Thực tế, điều này không hoàn toàn đúng bởi vì DurationInt là một lớp giá trị, do đó trình biên dịch sẽ tránh gói số nguyên nếu có thể.

+66

Bất kỳ công nghệ đủ tiên tiến nào cũng không thể phân biệt được với ma thuật. – ripper234

+4

May mắn thay hầu hết các IDE có khả năng phân biệt nó! Chuyển đổi ngầm định được sử dụng khá nhiều trong Scala. Nếu bạn chỉ đọc tập tin văn bản, nó có thể gây nhầm lẫn ("phương pháp đó đến từ đâu") nhưng với sự hỗ trợ công cụ thích hợp, bạn sẽ có thể tìm đường đi, tại thời điểm đó Scala có thể có ý nghĩa và súc tích. (ví dụ, 20.seconds có thể đọc được nhiều hơn 'DurationInt mới (20) .seconds()' miễn là bạn biết nó hoạt động như thế nào) –

+1

Nếu bạn thấy mình sử dụng implicits, hãy tự hỏi bản thân xem có cách nào để đạt được điều tương tự mà không cần sự giúp đỡ của họ. http://twitter.github.com/effectivescala/#Types và Generics-Implicits – oluies

6

"Phép thuật" đang diễn ra ở đó được gọi là "chuyển đổi ngầm". Bạn đang nhập các chuyển đổi tiềm ẩn và một số trong số chúng xử lý chuyển đổi giữa Int (và Double) thành Duration. Đó là những gì bạn đang đối phó với.

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