2013-04-26 22 views
10

Một số Scala API alias này-tự, ví dụ,Aliasing này trong scala với tự =>

trait Function1[-T1, +R] extends AnyRef { self => 

tôi biết làm thế nào răng cưa này hoạt động nói chung, nhưng không thấy như thế nào các đặc điểm như lợi ích Function1 từ nó. Hàm 1 không sử dụng tự ở bất kỳ đâu trong định nghĩa của nó ngoại trừ đề cập ban đầu, vì vậy mục đích của nó ở đây là gì?

Các biến thể của câu hỏi này đã được hỏi trước đó, nhưng câu trả lời không được áp dụng trực tiếp. Các câu trả lời đã thảo luận về các loại tự và các lớp bên trong, nhưng tôi không thấy cách áp dụng ở đây.

+0

Nó có thể được thực hiện để bạn vẫn có thể truy cập 'this' trong phạm vi bên ngoài nếu' Function1' được bọc bên trong một lớp/đặc điểm khác. – adelbertc

+1

Có phải 'bí danh' tự' cho 'này' có thể hiển thị với các kiểu có nguồn gốc không? Nếu vậy, có lẽ có sự phụ thuộc vào nó ở một nơi khác trong thư viện? –

Trả lời

10

Xem https://github.com/scala/scala/blob/2.10.1/src/library/scala/Function1.scala#L8 nơi nó nói

// GENERATED CODE: DO NOT EDIT. See scala.Function0 for timestamp. 

Mã này được tạo ra bởi các máy phát tương tự cho Function0 qua Function22. Bằng cách nào đó khi nó đi vào Function5 bạn bắt đầu thấy self đang được sử dụng:

self.apply(x1, x2, x3, x4, x5)).curried 

Vì vậy, tôi nghi ngờ nó là dễ dàng hơn để có self => được tích hợp trong mẫu máy phát điện.

Đây là số commit để thêm tham chiếu tự. Thông điệp cam kết thực sự giải thích lý do tại sao nó làm điều gì đó khác nhau cho n> = 5, tôi trích dẫn:

FunctionN, trong đó N> 4, nhiều lớp học ít được tạo ra tĩnh tại chi phí của việc tạo ra nhiều đối tượng tự động (mà có vẻ hợp lý cho biết mức độ phổ biến của các chức năng như vậy). Điều này cũng cho phép cà ri hoạt động trong hàm N cho N> 8 mà không phải chạy theo chiều dài tên tệp hạn chế.

+0

Sự khác biệt giữa 'self.apply (x1, x2, x3, x4, x5)). Curried' và' áp dụng (x1, x2, x3, x4, x5)). Làm một bài kiểm tra nhanh họ xuất hiện để làm việc giống hệt nhau. Vì vậy, có vẻ như câu hỏi OP vẫn chưa được trả lời. – sourcedelica

+0

@sourcedelica, vâng, tôi đã thêm mã khảo cổ học bằng cách tìm kiếm kho lưu trữ danh sách gửi thư và trình theo dõi vấn đề, nhưng không thể tìm thấy bất kỳ điều gì. Tôi thậm chí đã tải xuống 2.7.2 nhưng nó cũng hoạt động ở đó mà không có 'self'. Ngoài việc đào ra rằng 'self' * được * tham chiếu trong' Function5' đến 'Function22', tôi không có bất kỳ lời giải thích nào khác ngoài việc nó được thực hiện cho mục đích dễ đọc hoặc chỉ trong trường hợp ... – huynhjl

+0

Cảm ơn - Tôi muốn giới thiệu rằng OP đặt câu hỏi trên 'scala-user'. – sourcedelica