scala的implicit和magnet模式
21 April 2015
scala的implicit和magnet模式
对初学scala的人,implicit像一个黑魔法,来无影去无踪,像它的名字一样非常“含蓄”。
从某种意义上讲,implicit是一个类型系统的游戏。scala是强类型系统,所有的参数都需要符合类型预期,如果需要一个Int类型,你传来一个String,编译器会报类型不符错误。implicit的引入,使在报错之前还有一次机会,即:如果编译器在当前作用域内找到一个从String转换到Int的implicit定义函数,编译器会用这个implicit把你传给它的String转换成它需要的Int,于是一切又愉快的发生下去了。
当然这只是implicit的一种使用场景,spray.io(已合并到akka-http)的magnet模式利用的就是这个特性。
magnet模式
magnet模式简单讲就是通过定义一个magnet类型作为统一的参数,然后针对需要重载的参数列表,类型等,在magnet类型的companion object中实现相应的转换为magnet类型的implitcit函数。
如:可以定义一个Magnet类型实现一个接受任意参数的add函数
def add(magnet: MyMagnet): magnet.Result = magnet()sealed trait MyMagnet { type Result def apply(): Result}object MyMagnet { //一个整形参数到MyMagenet的转换 implicit def fromInt(i: Int) = new MyMagnet { type Result = Int def apply(): Result = i + 1 } //一个String参数到MyMagenet的转换 implicit def fromString(s: String) = new MyMagnet { type Result = String def apply(): Result = "hello " + s } //一个String参数加一个整形参数到MyMagenet的转换 implicit def fromStringAndInt(tuple: (String, Int)) = new MyMagnet { type Result = String def apply(): Result = tuple._1 + tuple._2.toString }