Scala闭包,自由和绑定变量,匿名函数

时间:2020-02-23 14:41:45  来源:igfitidea点击:

闭包可以定义为函数的返回值取决于该函数外部定义的一个或者多个变量的值。
闭包是函数的实例,该函数的值的非局部变量已绑定到值或者存储位置。

考虑下面的例子;

object Divide {

def main(args:Array[String]) {
println( "Divided value = " + divider(4) )
println( "Divided value = " + divider(6) )
println( "Divided value = " + divider(8) )
println( "Divided value = " + divider(10) )
}

var div = 2
val divider = (i:Int) => i/div
}

我们使用主函数定义一个对象Divide,该函数接受String Array类型的参数,并通过调用在main方法外部定义的变量除法器来打印除法器的值,在该方法中,我们将传递给除法器的值与已初始化的div值" 2"进行除法以外的主要方法。

i和div是两个自由变量。
i是函数的形式参数。
div不是形式参数,并且在函数外部但在封闭范围内引用了变量

var div = 2
val divider = (i:Int) => i/div

输入Divide.main(null)运行以上示例。

输出:

Divided value = 2
Divided value = 3
Divided value = 4
Divided value = 5

下图显示了以上程序在Scala shell中的执行。

自由变量和绑定变量

在函数中使用但既不是局部变量也不是函数的形式参数的变量称为自由变量。

考虑一个自由变量的例子。

class Marks(m1: Int) {

var marks : Int = m1

def totalmarks(ma1:Int) {
marks = marks+10
println("Total marks secured: " +marks)
}
}

object m1 {

def main(args:Array[String]) {
var m1 = new Marks(45)
m1.totalmarks(45)
}
}

输入" m1.main(null)"运行,您将获得输出"已保护的总标记数:55"。

绑定变量是以前没有使用但已绑定到特定值或者一组值的变量。

考虑绑定变量的例子。

val result = (i:Int) => i * 6

输入result(32)运行,您将得到类似于res2:Int = 192的输出。

每次调用结果时,我都会绑定到一个新值。

匿名功能

匿名函数是未绑定到标识符的函数定义。
换句话说,函数定义没有隐式名称。

考虑下面的匿名函数示例;

var a = (x: Int) => x + 1

如您所见,我们没有在等号后为函数指定任何标识符。
没有与函数定义关联的绑定。
这就是为什么将其称为匿名函数的原因。
在声明的说明之后,解释器给出的输出为:

a: Int => Int = <function1>

a具有对该匿名函数的对象引用,可以称为" a(4)",其产生的输出类似于" res16:Int = 5"。