scala在定义方法时可以定义隐式参数,同时再给隐式参数设定默认值。在调用此方法时可以不需要传入隐式参数的实参,然而隐式参数依然会起作用。这看上去调用方法变得很简洁。
隐式参数的应用涉及3个步骤:
1、在方法的定义中的参数前要有implicit关键词,并且函数的定义方式是柯里化的。
2、在另一个object中定义隐式参数的默认值。其实简单点的话也可以直接在方法定义隐式参数后面直接赋默认值而不必另外再定义一个object来处理隐式参数的默认值。
3、在调用方法前先import这个object中的内容进来,然后调用方法。调用方法不必传入隐式参数的实参。
以下是代码例子:
package demo.classtest
object ImplicitParameterDemo {
case class Remote(address: String)
case class Home(address: String)
object Transportation {
/**
* 如果在方法中定义了隐式参数,在调用方法时可以不必显式传入隐式参数。
* @param transportTools
* @param remote1
* @param home1
*/
def transport(transportTools: String)(implicit remote1: Remote, home1: Home) = {
println(s"To celebrate spring festival, go from $remote1 to $home1 by $transportTools")
}
}
object Address {
//在此object中定义的隐式变量一定要和transport方法中的隐式参数类型相对应,对应是指类型要匹配而不是变量名匹配。
//此处的定义便是对transport方法中的隐式参数进行初始化默认值。
implicit val remote = new Remote("Shanghai")
implicit val home = new Home("BeiKing")
}
object GoHome {
import Address._
/**
* 这边调用transport方法并未传入隐式参数,这是合法的。隐式参数的默认值在Address对象中有定义。
* 所以在调用此方法之前一定要先导入Address对象中的所有内容过来。
* 调用此方法时如果没有显式传入隐式参数,scala会自动去找隐式参数对应的默认值。
*/
Transportation.transport("AirPlane")
}
def main(args: Array[String]): Unit = {
GoHome
}
}
运行结果:
To celebrate spring festival, go from Remote(Shanghai) to Home(BeiKing) by AirPlane