2015-08-29 16 views
6

Đối với chuyển đổi ngầm tại Scala, tôi có thể sử dụng chức năng chuyển đổi ngầmSự khác nhau giữa chuyển đổi với chức năng tiềm ẩn và lớp tiềm ẩn trong Scala

implicit def intToX(i:Int):X = new X(i) 

1.myMethod // -1 

hoặc ngầm lớp

implicit class X(i: Int) { 
    def myMethod = - i 
} 

1.myMethod // -1 

Có sự khác biệt giữa hai? Khi nào tôi nên thích cái này hơn cái kia?

Có một câu hỏi liên quan về implicit conversion vs. type class nhưng nó chỉ so sánh chức năng tiềm ẩncác lớp học kiểu. Điều tôi quan tâm là sự khác biệt từ các lớp ẩn số .

Trả lời

14

lớp Implicit là một đường cú pháp cho phương pháp ngầm và một lớp:

http://docs.scala-lang.org/sips/completed/implicit-classes.html:

Ví dụ, một định nghĩa có dạng:

implicit class RichInt(n: Int) extends Ordered[Int] { 
    def min(m: Int): Int = if (n <= m) n else m 
    ... 
} 

sẽ được chuyển đổi bởi trình biên dịch như sau:

class RichInt(n: Int) extends Ordered[Int] { 
    def min(m: Int): Int = if (n <= m) n else m 
    ... 
} 

implicit final def RichInt(n: Int): RichInt = new RichInt(n) 

lớp Implicit đã được thêm vào trong scala 2.10 bởi vì nó được là rất phổ biến để xác định lớp mới với việc xác định phương pháp ngầm chuyển đổi nó.

Nhưng nếu bạn không cần phải xác định một lớp mới nhưng xác định chuyển đổi ngầm lớp hiện có bạn tốt hơn nên sử dụng một phương pháp ngầm

+0

Cảm ơn, đó chính xác là những gì tôi muốn biết! – Mifeet

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