函数或者方法可以带有一个标记为implicit
的参数。在这种情况下,编译器将会查找缺省值,提供给该函数或者方法。示例:
case class D(left:String,right:String)
def quote(title:String)(implicit d:D) =
d.left+title+d.right
可以用一个显示的D睇相来调用quote方法。这样:
quote("hello")(D("<<",">>"))//这其实就是柯里化
也可以略去参数列表:
quote("hello")
在这种情况下,编译器会查找一个类型为D的隐式值。这必须是一个被声明为implic的值。编译器将在如下两个地方查找这样的一个对象:
- 当前作用域所有可以用单个标识符指代的满足类型要求的val和def
- 与所要求类型相关联的类型的半生对象(相关联类型包括所要求类型本身以及他的类型参数)
比如,我们可以做一个对象:
object A {
implicit val m = D("<<",">>")
……
}
这样我们就可以从这个对象引入所有的值:
import A._
如此一来,两个标点符号就可以隐式的提供给quote函数了
如下代码是有两个相同类型的隐式参数是行不通的,因为编译器不知道怎么对应
def quote(title:String)(implicit left:String, right:String)
但是,隐式参数有什么作用呢?之后再去分析