加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

function – scala foreach和map initializers

发布时间:2020-12-16 19:19:23 所属栏目:安全 来源:网络整理
导读:刚刚看到一个有趣的可能性,在 Scala中为高阶函数(如foreach或map)初始化代码块: (1 to 3) map { val t = 5 i = i * 5}(1 to 3) foreach { val line = Console.readLine i = println(line) } 这是一些记录的功能还是我应该避免这样的结构?我可以想象,“初始
刚刚看到一个有趣的可能性,在 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的原始问题(http://extrabright.com/blog/2010/07/10/scala-question-regarding-readline)

解决方法

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

这个构造的一个可能用途是块用于定义可变变量,并且结果函数在每次调用时都会变量变量.变量将被初始化一次,由函数关闭,并且每次调用函数时它们的值都会更新.

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

(1 to 6) map {
      var total = 1
      i => {total *= i;total}
    }

(顺便说一句,抱歉使用阶乘作为例子.它或者是斐波那契.功能性
Progamming Guild规则.你有问题,把它们带到大厅的男孩们那里.)

让块返回函数的一个不太重要的原因是在块中更早地定义辅助函数.例如,如果你的第二个例子是

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

结果是每行读取三行并回显一次,而您的示例读取行一次并回显三次.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读