scala的implicit和magnet模式  

JerryXia 发表于 , 阅读 (0)
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    }