概述
implicit
上下文参数
implicit val b: Int = 10
def plus(a: Int)(implicit b: Int): Int = a + b
隐式转换
implicit def stringToInt(s: String): Int = Integer.parseInt(s)
def plus(a: Int, b: Int): Int = a + b
puls("2","3")
动态属性&方法
implicit def strFile(dir: String) = new {
val isDir:Boolean = true
// 动态添加方法
def listDir(): List[File] = {
val d = new File(dir)
// _只有作为参数时才能省略,作为主体时不能省略
d.listFiles().filter(_.isDirectory).toList
}
}
assert("path".listDir().size > 0)
assert("path".isDir)
闭包
闭包是指,依赖声明在函数之外的一个或多个变量
var factor = 3
val multiplier = (i:Int) => i * factor
multiplier成为一个闭包,因为引用了在multiplier之外的factor变量,此时factor称为自由变量
这个自由变量是在运行时执行决定其真正的值的,确认自由变量运行时值的过程,称为变量捕获
注意scala的变量捕获有变量捕获中,捕获的是当前运行时变量本身的最后快照,也就是变量捕获每次可以捕获到捕获之前的变化,但不能捕获已经捕获之后的变化
柯里化
柯里化也是函数式编程的标志之一
函数柯里化是指,把接收多个参数的函数变换成,接收一个单一参数并返回一个,接收余下参数并返回结果新函数
def using[A, B <: {def close(): Unit}] (closeable:()=> B) (process: B => A): A =
try { process(closeable()) } finally { closeable.close() }
柯里化是一个在函数式编程中大量使用的
- 柯里化是一个自带延迟执行(柯里化函数的完整执行依托最后一步)
- 柯里化善于封装提取不变性