12-scala的隐式参数

143 阅读1分钟

隐式参数

我们可以用implicit来声明函数的参数,如果我们没有显示声明参数,那么可以使用之前生命过为implicit的参数,直接看代码实例:

package example

abstract class Adder[T] {
  def add(a: T, b: T): T
  def unit: T
}

object MyExample {

  implicit val intAdder = new Adder[Int] {
    def add(a: Int, b: Int) = a + b
    def unit = 0
  }

  implicit val stringAdder = new Adder[String] {
    def add(a: String, b: String) = a ++ b
    def unit = ""
  }

  def sum[T](xs: List[T])(implicit adder: Adder[T]): T = {
    if (xs.isEmpty) {
      adder.unit
    } else {  // 尾递归
      adder.add(xs.head, sum(xs.tail))
    }
  }

  def main(args: Array[String]): Unit = {
    // 自动匹配隐式参数intAdder
    val res1 = sum(List(1, 2, 3))
    println(res1)
    // 自动匹配隐式参数stringAdder
    val res2 = sum(List("One", "Two", "Three"))
    println(res2)
  }
}

代码输出:

6
OneTwoThree