2013-10-21 14 views
104

Tôi mới sử dụng Scala và tôi thực sự không thể tìm thấy nhiều về từ khóa type. Tôi đang cố hiểu ý nghĩa của cụm từ sau:Hiểu từ khóa 'loại' nào trong Scala

type FunctorType = (LocalDate, HolidayCalendar, Int, Boolean) => LocalDate 

FunctorType là một loại bí danh, nhưng nó có nghĩa gì?

Trả lời

110

Vâng, loại bí danhFunctorType chỉ là một viết tắt cho

(LocalDate, HolidayCalendar, Int, Boolean) => LocalDate

Loại bí danh thường được sử dụng để giữ cho phần còn lại của mã đơn giản: bây giờ bạn có thể viết

def doSomeThing(f: FunctorType) 

sẽ được biên dịch viên biên dịch là

def doSomeThing(f: (LocalDate, HolidayCalendar, Int, Boolean) => LocalDate) 

Điều này giúp tránh xác định nhiều loại tùy chỉnh chỉ là bộ dữ liệu hoặc hàm được xác định trên các loại khác, ví dụ:

Ngoài ra còn có một số trường hợp sử dụng thú vị khác cho type, như được mô tả ví dụ trong this chapter trong số Lập trình trong Scala.

153

Thực tế, từ khóa type trong Scala có thể làm được nhiều hơn là chỉ đánh răng một loại phức tạp thành tên ngắn hơn. Nó giới thiệu thành viên loại.

Như bạn đã biết, một lớp học có thể có các thành viên của trường và các thành viên phương pháp. Vâng, Scala cũng cho phép một lớp học có các thành viên loại.

Trong trường hợp cụ thể, type thực sự là giới thiệu bí danh cho phép bạn viết mã súc tích hơn. Hệ thống kiểu chỉ thay thế bí danh với kiểu thực khi kiểm tra kiểu được thực hiện.

Nhưng bạn cũng có thể có một cái gì đó như thế này

trait Base { 
    type T 

    def method: T 
} 

class Implementation extends Base { 
    type T = Int 

    def method: T = 42 
} 

Giống như bất kỳ thành viên khác của một lớp, các thành viên loại cũng có thể là trừu tượng (bạn chỉ cần không chỉ định những giá trị của họ thực sự là) và có thể được ghi đè trong việc triển khai.

Loại thành viên có thể được xem dưới dạng kép của generics vì phần lớn những thứ bạn có thể thực hiện với generics có thể được dịch sang thành viên kiểu trừu tượng.

Vì vậy, có, chúng có thể được sử dụng để đánh răng, nhưng không giới hạn chúng chỉ vì điều này, vì chúng là một tính năng mạnh mẽ của hệ thống kiểu Scala.

Xin xem câu trả lời này tuyệt vời để biết thêm chi tiết:

Scala: Abstract types vs generics

+34

Điều quan trọng cần nhớ là việc sử dụng loại bên trong lớp sẽ tạo thành viên loại thay vì bí danh. Vì vậy, nếu bạn chỉ cần một bí danh loại, hãy xác định nó trong đối tượng đồng hành. –

5

Chỉ cần một ví dụ để xem làm thế nào để sử dụng "loại" như bí danh:

type Action =() => Unit 

Định nghĩa trên định nghĩa Hành động là bí danh của loại thủ tục (phương thức) lấy danh sách tham số trống và đơn vị trả về đó.