隐式参数
我们可以用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