39

简单理解 Scala 的闭包

 5 years ago
source link: https://mp.weixin.qq.com/s/XgJhoZP1MIjot-oCTfWaVA?amp%3Butm_medium=referral
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

闭包这个词大家都不陌生,尤其是做spark的同学,经常会看到,但是很多人还是对闭包比较懵懂,就像前面说的watermark一样,大家都很熟悉朗朗上口,但是又貌似一头雾水没有理解。

不懂watermark?来吧~

那么,浪尖今天就说说闭包~

首先给出浪尖理解的定义吧:

「函数」和「函数内部能访问到的变量」(也叫环境)的总和,就是一个闭包。

按照这个定义呢?下面就应该是一个闭包:

var factor = 3
val adder = (i:Int) => i * factor

可能会有同学有疑问:浪尖,这不对啊? 我看网上说的闭包构造是:

闭包首先有函数嵌套,内部函数引用外部函数的变量,然后返回的是一个函数。

应该是这个样子的:

object closure {
  def main(args: Array[String]): Unit = {
    println(makeAdd()(1))
  }
  def makeAdd() = {
    val more = 10
    (x: Int) => x + more
  }
}

为啥要用函数嵌套?

需要外部函数的作用主要是隐藏变量,限制变量作用的范围。

有些人看到「闭包」这个名字,就一定觉得要用什么包起来才行。其实这是翻译问题,闭包的原文是 Closure,跟「包」没有任何关系。

所以函数套函数只是为了造出一个局部变量,跟闭包无关。

为啥要return函数呢?

很明显,不return函数无法使用闭包~~

那么现在换个脑子吧,我们将more 变成makeAdd的参数,那么就是下面的形式:

def makeAdd(more : Int) = (x: Int) => x + more

请问这种结构看着眼熟么? 欢迎留言~

BFFRbqV.jpg!web

490+球友~


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK