Scala 基础(8)—— 占位符_和部分应用函数
1. 占位符 _ 针对?Scala 基础(7)—— 函数字面量和一等函数?中最后提到的,关于 filter 函数字面量的精简写法,可以使用占位符 _ 来代替。 占位符_,用来表示一个或者多个参数。(这里的多个参数不是表示一个下划线代表多个参数,而是多个下划线可以代表多个参数) 在函数字面量的表达中,可以将下划线看成是“要填的空”,函数每次被调用时,这个“空”就回被一个参数“填”上。 例如: def main(args: Array[String]): Unit = { val list = List(1,2,3) list.filter(x => x > 0) list.filter(_ > 0) // 与上面的调用是等价的 } ? 这种调用仅限于 Scala 编译器能够在编译期间推断出参数的类型。 当编译器无法再编译期间推断参数类型,则必须显式地给出参数类型。 例如: def main(args: Array[String]): Unit = { // val sum = _ + _ // 编译失败 val sum = (_: Int) + (_: Double) println(sum(1,2)) // 输出3.0 } ? ? 2.? 部分应用函数 在使用下划线时,本质上是在编写一个部分应用函数(partially applied function)。 这里的意义在于: 当调用某个函数,传入任何参数时,实际上是应用那个函数到这些参数上。 当然这种描述过于抽象,所以我们看下面的例子: ? 首先,定义一个方法 sum(): def sum(a: Int,b: Int,c: Int) = a + b + c 显然,这是一个计算三个整数和的方法。一般的调用方式如下: val value = sum(1,3) ? 以上是一个简单的方法的调用,部分应用函数的功能,就是将 def 定义的方法,映射成函数值的形式。 例如: val f = sum _ // f 是一个 (Int,Int,Int) => Int 类型的函数字面量 以上,将方法映射成了一个??(Int,Int) => Int 类型的函数字面量。 它的调用方式与方法类似,但是本质发生了改变: val value = f(1,3) ? 之所以称为部分应用函数,是因为你并没有把那个函数应用到所有的入参。 还是拿上面的例子做说明,可以通过给出一些必填的参数来表达一个部分应用函数: val f = sum(1,_: Int,2) // f 是一个 Int => Int 类型的函数字面量 在这个例子中,部分应用函数给出了第一个和第三个参数,由于只缺失一个参数,编译器将生成一个新的函数字面量,类型是 Int => Int。 ? 部分应用函数的作用在于: 虽然不能将方法或嵌套的函数直接赋给某个变量,或者作为某个函数的入参,但是可以通过部分应用函数的方式,将其转成一个函数值来完成这些操作。 最后需要说明的是,只有明确需要函数的地方,才能使用部分应用函数。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- 有没有办法将bash配置为始终页面输出?
- angularjs – $state.go不使用第三级嵌套状态(使用Ionic选项
- Bootstrap:关于bootstrap单页面中多Modal的问题
- learning scala pattern matching
- WebService的适用场合
- Angularjs:使用没有ng-options的selectbox绑定复杂对象
- twitter-bootstrap – 将href添加到btn-toolbar中的一个按钮
- BootStrap按钮、图片
- bash – 在UNIX shell中实现`sumproduct`
- 如何从console main方法运行SimpleSwingApplication?