Function scala foreach和映射初始值设定项

Function scala foreach和映射初始值设定项,function,scala,initializer,Function,Scala,Initializer,刚才看到了在Scala中为高阶函数(如foreach或map)初始化代码块的一种有趣的可能性: (1 to 3) map { val t = 5 i => i * 5 } (1 to 3) foreach { val line = Console.readLine i => println(line) } 这是一个文档化的特性,还是应该避免这种构造?我可以想象,“初始化”块进入构造函数,而闭包本身变成apply()方法 感谢Pat提出的原始问题(

刚才看到了在Scala中为高阶函数(如foreach或map)初始化代码块的一种有趣的可能性:

(1 to 3) map {
  val t = 5
  i => i * 5
}


(1 to 3) foreach {  
  val line = Console.readLine  
  i => println(line)  
}  
这是一个文档化的特性,还是应该避免这种构造?我可以想象,“初始化”块进入构造函数,而闭包本身变成apply()方法


感谢Pat提出的原始问题()

首先,原始博客的评论“帖子提及”

”是一个值,无法执行,只能从“
控制台.readLine
”方法执行的结果中分配一次。
它在您的闭包中使用的次数少于三次。
但如果将其定义为方法,则将执行三次:

该博客有一个关于高阶函数的有趣部分,包括:

Scala在语法上为这些高阶函数提供了更大的灵活性。
在迭代调用中,我们创建了一个完整的匿名方法,只是为了再次调用
println(String)
方法。
考虑到
println(String)
本身就是一个方法,它接受
String
并返回
Unit
,人们会认为我们可以将其压缩一点。事实证明,我们可以:

通过省略括号并只指定方法名,我们告诉Scala编译器我们想要使用
println
作为函数值,并将其传递给
iterate
方法。
因此,我们不是创建一个新方法来处理一组调用,而是传入一个旧方法,该方法已经实现了我们想要的功能。
这是C和C++中常见的模式。事实上,将函数作为函数值传递的语法完全相同。似乎有些事情永远不会改变


虽然使用的功能并不少见,但我承认这是一个相当奇怪的功能组合。基本技巧是Scala中的任何块都是一个表达式,其类型与块中的最后一个表达式相同。如果最后一个表达式是函数,这意味着块具有函数类型,因此可以用作“map”或“foreach”的参数。在这些情况下,当调用“map”或“foreach”时,将对块进行求值。该块计算为一个函数(在第一种情况下为i=>i*5),然后该函数在该范围内映射

此构造的一个可能用途是块定义可变变量,结果函数每次调用时都会对变量进行变异。变量将初始化一次,由函数关闭,每次调用函数时其值都会更新

例如,这里有一种计算前6个阶乘数的方法,有点令人惊讶

(1 to 6) map {
      var total = 1
      i => {total *= i;total}
    } 
(顺便说一句,很抱歉用阶乘作为例子。不是那样就是斐波那契函数 制定公会规则。你有问题的话,去大厅和下面的男孩们谈谈。)

让块返回函数的一个不太必要的原因是在块的前面定义辅助函数。例如,如果您的第二个示例是

(1 to 3) foreach {  
  def line = Console.readLine  
  i => println(line)  
}

结果是,三行代码被读取并回显一次,而您的示例将该行读取一次并回显三次。

比我的答案精确得多+1在阶乘示例中,应使用
total*=i
而不是引入第二个名为
counter
(1 to 6) map {
      var total = 1
      i => {total *= i;total}
    } 
(1 to 3) foreach {  
  def line = Console.readLine  
  i => println(line)  
}