当前位置:首页 > 开发 > 编程语言 > Scala > 正文

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

发表于: 2015-02-27   作者:bit1129   来源:转载   浏览:
摘要: 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

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十四】Scala核心八:闭包

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
本节主要内容 (一)函数字面量(值函数) (二)匿名函数 (三)函数的简化 (四)函数参数 (四)
Scala中继承&练习 1. 扩展如下的BankAccount类,新类CheckingAccount对每次存款和取款都收取1美元的
本节主要内容 包的作用与定义 包的作用域与引入(import)的使用方法 访问控制 包对象 import高级特
Scala的类层级 Scala里,每个类都继承自通用的名为Any的超类。因为所有的类都是Any的子类,所以定义
1、 包的定义 /** * 自定义Spark.navigation包 */ package spark.navigation{ abstract class Navig
根据Play!开发团队透露,团队正在着力开发Play的下一个主要版本(也就是Play 2.0),该版本集成了一
用Java语言开发许久了,一直接触指令式的语言开发,同时也做的多了,也逐渐感觉到了静态语言的一些
继承类 使用extends关键字来继承一个类。如果将类声明为final的,则这个类不能被继承。如果将类的方
用Java语言开发许久了,一直接触指令式的语言开发,同时也做的多了,也逐渐感觉到了静态语言的一些
继承类 使用extends关键字来继承一个类。如果将类声明为final的,则这个类不能被继承。如果将类的方
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号