(Scala 2.11.8)Scala typeclasses độ phân giải ngầm
Xét đoạn mã sau:
object ScalaTest extends App {
class Wrapper {
import Wrapper._
def init(): Unit = {
// "could not find implicit value for parameter tc: ScalaTest.Wrapper.TC[Int]"
printWithTC(123)
// Compiles
printWithTC(123)(IntTC)
// Compiles again!
printWithTC(132)
}
}
object Wrapper {
trait TC[A] {
def text(a: A): String
}
implicit object IntTC extends TC[Int] {
override def text(a: Int) = s"int($a)"
}
def printWithTC[A](a: A)(implicit tc: TC[A]): Unit = {
println(tc.text(a))
}
}
(new Wrapper).init()
}
tôi có một loạt các câu hỏi liên quan đến đoạn mã này:
- Tại sao doesn' t
IntTC
được giải quyết ngay từ đầu? - Tại sao nó biên dịch sau khi được sử dụng một lần? (Nếu bạn nhận xét ra lời gọi thứ nhất, mã hoạt động)
- đâu typeclass implicits nên được đặt để có được giải quyết đúng cách?
Tôi không có ý tưởng những gì đang xảy ra, nhưng chỉ cần để ý, rằng nếu bạn di chuyển các đối tượng được trước khi đến lớp, mã cũng biên dịch. – Dima