Bắt đầu với phiên bản 2.10, Scala đã giới thiệu các Lớp ẩn để xử lý chính xác vấn đề này.
Điều này sẽ thực hiện chuyển đổi ngầm định trên một loại nhất định sang một lớp được bao bọc, có thể chứa các phương thức và giá trị của riêng bạn.
Trong trường hợp cụ thể của bạn, bạn sẽ sử dụng một cái gì đó như thế này:
implicit class RichInt(x: Int) {
def isAFactorOf(y: Int) = x % y == 0
}
2.isAFactorOf(10)
// or, without dot-syntax
2 isAFactorOf 10
Lưu ý rằng khi được biên dịch, điều này sẽ kết thúc giá trị thô của chúng tôi thành a RichInt(2)
. Bạn có thể giải quyết vấn đề này bằng cách khai báo RichInt của bạn là một lớp con của AnyVal
:
implicit class RichInt(val x: Int) extends AnyVal { ... }
Điều này sẽ không gây ra quyền anh, nhưng nó hạn chế hơn một lớp ngầm điển hình. Nó chỉ có thể chứa các phương thức, không phải giá trị hoặc trạng thái.