NightPxy 个人技术博客

scala

Posted on By NightPxy

概述

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() }

柯里化是一个在函数式编程中大量使用的

  • 柯里化是一个自带延迟执行(柯里化函数的完整执行依托最后一步)
  • 柯里化善于封装提取不变性