`
bit1129
  • 浏览: 1051456 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

【Scala十四】Scala核心八:闭包

 
阅读更多

Free variable A free variable of an expression is a variable that’s used inside the expression but not defined inside the expression. For instance, in the function literal expression (x: Int) => (x, y), both variables x
and y are used, but only y is a free variable, because it is not defined inside the expression.


Bound variable A bound variable of an expression is a variable that’s both used and defined inside the expression. For instance, in the function literal expression (x: Int) => (x, y), both variables x and y are used,
but only x is bound, because it is defined in the expression as an Int and the sole argument to the function described by the expression.

 

 

closure A function object that captures free variables, and is said to be “closed” over the variables visible at the time it is created.

闭包是一个函数对象,当闭包中的自由变量绑定了具体的值后,称之为闭包

 

 

问题:

对于闭包(x: Int) => (x, y),当闭包建立后,y的值发生改变,调用闭包时,y的值是建立时的值还是改变的值?答案是改变后的值。也就是说,闭包函数是在调用执行时才从当前的上下文中获取到y的值

 

 

 

package spark.examples.scala.closure

object ClosureTest {

  def sum(args: List[Int]) = {
    var sum = 0
    //sum += _是函数常量,其中sum是自由变量
    val calc = sum += (_: Int)
    args.foreach(calc)
    println("sum1: " + sum) //6, sum是自由变量,计算结束后,sum的值在闭包内的变化,能够在外面也看到
    args.foreach(calc) //sum的值改变后,函数常量能够看到这个变化,再次计算结果12
    println("sum2: " + sum) //12,
  }

  def increaseBy(offset: Int) = {

    def add(x: Int) = {
      x + offset
    }
    add _
    //方法体可以直接使用 (x: Int) => x + offset
  }

  def main(args: Array[String]) {
    val args = List(1, 2, 3)
    sum(args)
    println(increaseBy(10)(100)) //110
  }
}

 

 

 

 

分享到:
评论

相关推荐

    Scala函数和闭包.md

    Scala函数和闭包

    Scala 闭包

    Scala 闭包 闭包是一个函数,返回值依赖于声明在函数外部的一个或多个变量。 闭包通常来讲可以简单的认为是可以访问一个函数里面局部变量的另外一个函数。 如下面这段匿名的函数: val multiplier = (i:Int) => i ...

    Scala编程_中文高清完整版附带案例源码

    第1章,“可伸展的语言”,给出了Scala的设计,和它后面的理由,历史的概要。 第2章,“Scala的第一步”,展示给你如何使用Scala完成若干种基本编程任务,而不牵涉过多关于如何工作的细节。本章的目的是让你的手指...

    Scala程序设计(第2版)

    第1章 零到六十:Scala简介 1 1.1 为什么选择Scala 1 1.1.1 富有魅力的Scala 2 1.1.2 关于Java 8 3 1.2 安装Scala 3 1.2.1 使用SBT 5 1.2.2 执行Scala命令行工具 6 1.2.3 在IDE中运行Scala ...

    SCALA从入门到精通个人笔记含代码

    目录如下 Scala简介&快速入门 基础语法 变量 数据类型 流程控制 操作符重载 模式匹配 函数式编程基础 函数式编程说明 函数定义/声明 ... 闭包closure 柯里化函数 控制抽象 递归高级 Akka 介绍

    ignite-scala:用于 Apache Ignite 上的分布式闭包的 Scala API

    用于上的分布式闭包的 Scala API。 灵感来自。 示例 0 - 集群设置 import org . apache . ignite . _ import org . apache . ignite . configuration . _ import ignite . scala . _ val cfg = new ...

    孢子:Scala孢子,安全的移动式封闭

    Spores是Scala编译器的扩展,可以在并发和分布式环境中更安全地使用闭包。 它使开发人员可以保证基于类型的功能属性,从而可以更好地控制功能环境。 Spores带有传递检查器,以确保JVM可以对捕获的类型进行序列化...

    快学 scala 中文版 带完整目录

    12.6 闭包 181 12.7 SAM转换 182 12.8 柯里化 183 12.9 控制抽象 185 12.10 return表达式 186 练习 187 第13章 集合 A2191 13.1 主要的集合特质 192 13.2 可变和不可变集合 193 13.3 序列 195 13.4 列表 ...

    leetcode分类-leetcode-scala:力码量表

    Scala的目标,Scala的手段,Scala的效果。 能在编译期做的约束和检查,就不要延迟到运行时。例如,ADT Scala warm-up: Keywords or tags 列表解析式 函数一等公民 鸭子类型 尾递归 代数类型 模式匹配 伴生对象 Non-...

    metal:Metal-Scala的快速拆箱数据结构

    Metal-Scala的快速拆箱数据结构 请参阅和相关的Metal提供了快速可变的集合,其性能应该接近使用原始图元数组的手写数据结构。 特别是: 金属集合本身不是专门的,但是由于宏和专门的方法,在访问,存储和更新元素...

    借贷管理源码java-embedded-kafka:一个提供内存Kafka实例来运行测试的库

    丑管理源码java 嵌入式卡夫卡 一个提供内存 Kafka 实例来运行测试的库。 灵感来自 . 版本兼容性矩阵 ...实例的代码包含在withRunningKafka闭包中。 一个例子,使用 ScalaTest: class MySpec extends An

    浅谈PHP 闭包特性在实际应用中的问题

    译注:原文作者比较火星,我不了解 Groovy 以及 Scala 语言,所以这里我加上 Javascript 的实现。 在开始之前先说明下,本例子仅仅是阐明观点,并没有考虑性能等其他方面的因素。 “货比三家” 用个简单的例子开始...

    leetcode分类-LeetCode:大楼能建多高,取决于地基挖有多深

    Scala的目标,Scala的手段,Scala的效果。 能在编译期做的约束和检查,就不要延迟到运行时。例如,ADT 自己一点练习,总结理论,是不是有些效率低下,还是找一本书(无论线上和线下)通读一遍,效率更高,做练习,...

    leetcode电脑下载-myLogs:我的日志

    Scala的目标,Scala的手段,Scala的效果。 能在编译期做的约束和检查,就不要延迟到运行时。例如,ADT 自己一点练习,总结理论,是不是有些效率低下,还是找一本书(无论线上和线下)通读一遍,效率更高,做练习,...

    Spark-Core学习知识笔记整理

    Spark-Core文档是本人经三年总结笔记汇总而来,对于自我学习Spark核心基础知识非常方便,资料中例举完善,内容丰富。具体目录如下: 目录 第一章 Spark简介与计算模型 3 1 What is Spark 3 2 Spark简介 3 3 Spark...

    jdk-8u181-windows-x64.zip

    jdk1.8新特性,例如:Lambda表达式(也称为闭包)是整个Java 8发行版中最受期待的在Java语言层面上的改变,Lambda允许把函数作为一个方法的参数(函数作为参数传递进方法中),或者把代码看成数据:函数式程序员对这...

    jgo:JGo - Golang 的 Java 编译器和运行时环境

    描述 旨在为 Java 虚拟机上的 Go 编程语言提供完整的编译器和运行时环境。 jgoc 编译器用 Scala 编写,运行时用 ... 闭包(lambda 表达式的子功能); 并发; 推迟、恐慌和恢复; 和 Switch 语句。 文档 贡献 为 JG

    4399大数据笔试题.pdf

    即StoreFile底层就是HFile HLog File,HBase中WAL(Write Ahead Log) 的存储格式,物理上是Hadoop的Sequence File 7.Scala语⾔的闭包描述哪⼀项不是正确的? 8.Kafka⾼吞吐的原因? 答案: 顺序读写磁盘,充分利⽤...

    javalruleetcode-Coding:记录编码问题、解决方案、解释、测试用例等

    C++、Java、Python、C#、Scala 目录 1. 数学 1.1 离散数学 1.1.1 图论 1.1.1.1 图遍历(BFS、DFS) 1.1.1.2 最小生成树(Prim、Kruskal) 1.1.1.3 最短路径(Dijkstra、Floyd) 1.1.1.4 最长路径 1.1.1.5 传递闭包 ...

Global site tag (gtag.js) - Google Analytics