Phép thuật phương thức apply () của Scala hoạt động như thế nào?


79

Trong Scala, nếu tôi định nghĩa một phương thức được gọi applytrong một lớp hoặc một đối tượng cấp cao nhất, phương thức đó sẽ được gọi bất cứ khi nào tôi nối một cặp dấu ngoặc đơn vào một thể hiện của lớp đó và đặt các đối số thích hợp apply()vào giữa chúng. Ví dụ:

class Foo(x: Int) {
    def apply(y: Int) = {
        x*x + y*y
    }
}

val f = new Foo(3)
f(4)   // returns 25

Vì vậy, về cơ bản, object(args)chỉ là cú pháp đường cho object.apply(args).

Scala thực hiện chuyển đổi này như thế nào?

Có chuyển đổi ngầm định được xác định trên toàn cầu đang diễn ra ở đây, tương tự như chuyển đổi kiểu ngầm định trong đối tượng Predef (nhưng khác về loại) không? Hay là một phép thuật sâu xa hơn? Tôi hỏi vì có vẻ như Scala rất ủng hộ việc áp dụng nhất quán một bộ quy tắc nhỏ hơn, thay vì nhiều quy tắc với nhiều ngoại lệ. Điều này ban đầu dường như là một ngoại lệ đối với tôi.


Câu trả lời:


67

Tôi không nghĩ rằng có điều gì sâu sắc hơn những gì bạn đã nói ban đầu: nó chỉ là đường cú pháp, theo đó trình biên dịch chuyển đổi f(a)thành f.apply(a)một trường hợp cú pháp đặc biệt.

Điều này có vẻ giống như một quy tắc cụ thể, nhưng chỉ một vài trong số này (ví dụ: với update) cho phép các cấu trúc và thư viện giống DSL .


4
Tôi muốn thêm "khi nào flà một đối tượng (bao gồm các hàm)". Khi flà một phương pháp, rõ ràng là không có bản dịch như vậy.
Alexey Romanov

2
@AlexeyRomanov: Chà, nếu flà một phương thức được định nghĩa mà không có danh sách tham số, thì f(a)nó thực sự được hiểu là một cái gì đó giống như vậy val _tmp = f; _tmp.apply(a). Nhưng điều đó thực sự đi sâu vào lãnh thổ của những sợi tóc.
Jörg W Mittag

20

Thực tế thì ngược lại, một đối tượng hoặc lớp có phương thức apply là trường hợp bình thường và một hàm là cách để xây dựng ngầm một đối tượng cùng tên với một phương thức apply. Trên thực tế, mọi hàm bạn xác định là một đối tượng của đặc điểm Hàm n (n là số đối số).

Tham khảo phần 6.6: Các ứng dụng chức năng của Đặc tả ngôn ngữ Scala để biết thêm thông tin về chủ đề này.


+1 để thay đổi Đặc tả ngôn ngữ Scala. Tôi đã thêm đúng vị trí vì số trang của bạn đã lỗi thời.
Alexandre Martins

8

Tôi hỏi vì có vẻ như Scala rất ủng hộ việc áp dụng nhất quán một bộ quy tắc nhỏ hơn, thay vì nhiều quy tắc với nhiều ngoại lệ.

Đúng. Và quy tắc này thuộc về tập hợp nhỏ hơn này.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.