【Scala谜题】使用占位符
笔记来源: Scala谜题 Scala 特别强调要书写简单、简洁的代码。匿名函数的语法 用有自解释参数的函数还可以做得更好,而且还可以用占位符语法。占位符语法可以省去参数声明: List(1,2).map { i => i + 1} List(1,2).map { _ + 1} 以上两个语句是等价的。但如果使用如下语句: List(1,2).map { i => println("Hi");i + 1 } List(1,2).map { println("Hi"); _ + 1 } 会发现,它们的输出结果不一样: Hi Hi List[Int] = List(2,3) Hi List[Int] = List(2,3) 为什么使用占位符语法的函数与预计结构不一样呢?因为匿名函数常常被当作参数传递,在代码中往往会看到它们在花括号 两个代码块的解析方式决定了它们有不同的行为。第一个语句 第二个表达式中,代码块被认为是 将刚刚那两个函数拆分后可以很方便看出它们的区别: scala> val printAndAddOne = (i: Int) => { println("Hi"); i + 1 } printAndAddOne: Int => Int = <function1> scala> List(1,2).map(printAndAddOne) Hi Hi res29: List[Int] = List(2,3) scala> val printAndReturnAFunc = { println("Hi"); (_: Int) + 1 } Hi printAndReturnAFunc: Int => Int = <function1> scala> List(1,2).map(printAndReturnAFunc) res30: List[Int] = List(2,3) Scala 鼓励简洁的代码,但太简洁时就会出现这样的情况。使用占位符语法时一定要注意由它所创建的函数范围。 这里学到的一点是:用占位符语法定义的匿名函数的范围只延伸到含有下划线 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |