柯里化是一种特殊的方法,可以有多个参数
//柯里化方法
def k1(x:Int)(y:Int) :Int = x+y
val i = k1(1)(2)
//给一个括号内赋值,下一个参数用 _ 顶替,返回一个函数
val i1: Int => Int = k1(1) _
//此时给给一个值就OK了,调用柯里化方法的运算逻辑,返回一个值
val i2 = i1(5)
println(i2)
柯里化方法可以传默认值,较普通方法更好用,因为普通方法就一个括号,调用方法给其参数时默认把值给前面的参数,前面的参数恰巧有默认值时,新来的参数会覆盖它,导致后面的变量没有值,无法调用方法
柯里化并不会,因为多个括号而混乱,一一对应,目的明确
object KeLiDemo {
def m1(x:Int = 100)(y :Int ) :Int = x+y
def main(args: Array[String]): Unit = {
val i = m1()(1)
println(i)
}
}
implicit 隐式参数
简单用法
object KeLiDemo {
//需要在后面的参数上加 implicit 这个参数要有值,添加implicit才有意义,
def m1( x:Int )(implicit y:Int =20) :Int = x+y
def main(args: Array[String]): Unit = {
//意义就是少写个括号,,给之前方法中的参数隐藏起来,默认知道这有值,你写不写括号都无所谓了
val i = m1(2)
println(i)
}
}
隐式参数: 编译时会到程序的上下文找到与自己数据类型相同的,参数名怎么取的不要紧,找到了,就把上面的的implicit修饰的值覆盖掉
object KeLiDemo {
def m1( x:Int )(implicit y:Int =20) :Int = x+y
def main(args: Array[String]): Unit = {
//覆盖掉上面方法中的默认值(20)
implicit val aaaa = 664
//可以继续加上隐式参数,但数据类型不能相同
implici val bbb = 1 //是错的 上面已经时int类型了,换成long,string什么都可以
val i = m1(2)
println(i)
//打印值为666
//这里加上数据类型int的没有问题,要在打印语句下面,如果两个数据类型相同的隐式参数在一起,它会不知道调用哪个
implicit val ccc = 2
}
}
也可以再写一个obj包,在其中写implicit 然后导包,导到具体的参数名(手动传的隐式参数优先级最高)
最好使用obj包,obj包是静态的,直接导包就能用,class包是类,需要实例化