还有另一种(IMO更简单,更灵活)的方式来达到类似的效果:
// Note the implicit is now a Tuple2
def myFun(arg: String)(implicit p: (String, Int) ): Unit = {
println(arg + p._1 + p._2)
/*otherwise your actual code*/
}
// These implicit conversion are able to produce the basic implicit (String,Int) Tuples
implicit def idis(implicit is: String, ii: Int): (String,Int)= (is,ii)
implicit def idi(s: String)(implicit ii: Int): (String,Int)= (s,ii)
// The basic implicit values for both underlying parameters
implicit val iString = " world! "
implicit val iInt = 2019
myFun("Hello")
myFun("Hello")(" my friend! ")
myFun("Hello")(" my friend! ",2020)
// Output is:
// Hello world! 2019
// Hello my friend! 2019
// Hello my friend! 2020
// If we add the following implicit,
implicit def ids(i: Int)(implicit is: String)= (is,i)
// we can even do
myFun("Hello")(2020)
// , and output is:
// Hello world! 2020
使用元组作为参数的基础表示不是一个好主意,因为隐式转换可能会干扰其他用途。实际上,对任何标准类型(包括库类型)的隐式转换通常会在任何非平凡的应用程序中造成麻烦。解决方案是创建一个专用的案例类来保存参数,而不是元组。一个重要的优点是,可以给它们指定比_1和_2更有意义的名称。