Function scala foreach和映射初始值设定项
刚才看到了在Scala中为高阶函数(如foreach或map)初始化代码块的一种有趣的可能性: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提出的原始问题(
(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)
}