Scala如何理解和使用闭包?

2021年3月23日15:08:05 发表评论 1,300 次浏览

Scala闭包是使用一个或多个自由变量的函数, 该函数的返回值取决于这些变量。自由变量是在Closure函数之外定义的, 不包含在该函数的参数中。因此, 闭包函数和普通函数之间的区别是自由变量。一种

自由变量

是在函数内未定义且未作为函数参数传递的任何类型的变量。自由变量未绑定到具有有效值的函数。该函数不包含free变量的任何值。

例子:

如果我们定义一个函数, 如下所示:

def example(a : double) = a*p / 100

现在, 运行上面的代码后, 我们将收到一个错误, 提示找不到p。所以现在我们给p功能之外。

// defined the value of p as 10
val p = 10
  
// define this closure.
def example(a : double) = a*p / 100

现在, 上面的函数可以运行了, 因为free变量有一个值。现在, 如果我们将函数运行为:

Calling the function: example(10000)
Input: p = 10
Output: double = 1000.0

现在, 如果自由变量的值发生变化, 闭包函数的值如何变化?

因此, 闭包函数的基本功能是, 它获取自由变量的最新状态, 并相应地更改闭包函数的值。

Input: p = 10
Output: double = 1000.0

Input: p = 20
Output: double = 2000.0

闭包函数可以进一步分为纯和不纯函数, 取决于free变量的类型。如果我们给自由变量一个类型变种那么该变量往往会在整个代码中随时更改该值, 因此可能导致更改闭包函数的值。因此, 这种闭包是不纯功能。另一方面, 如果我们声明类型的自由变量值那么变量的值将保持恒定, 从而使闭合函数成为纯函数。

例子:

// Addition of two numbers with 
// Scala closure
  
// Creating object
object GFG
{
     // Main method
     def main(args : Array[String])
     {
         println( "Final_Sum(1) value = " + sum( 1 ))
         println( "Final_Sum(2) value = " + sum( 2 ))
         println( "Final_Sum(3) value = " + sum( 3 ))
     }
          
     var a = 4
      
     // define closure function
     val sum = (b : Int) => b + a
}

输出如下:

Final_Sum(1) value = 5
Final_Sum(2) value = 6
Final_Sum(3) value = 7

在这里, 在上面的程序功能

是一个闭包函数。 var a = 4是不纯闭包。 a的值相同而b的值不同。

例子:

// Scala closure program to print a string
  
// Creating object
object GFG
{
     // Main method
     def main(args : Array[String])
     {
      
         var employee = 50
      
         // define closure function
         val gfg = (name : String) => println(s "Company name is $name" +
                        s " and total no. of employees are $employee" )
          
         gfg( "lsbin" )
     }
}

输出如下:

Company name is lsbin and total no. of employees are 50.

在上面的例子中gfg是一个闭包。 var employee是可变变量, 可以更改。


木子山

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: