Scala : Partial Functions 和 Type Parameters
April 21st, 2010
No comments
方法和函数是不同的,在Scala中,除了方法以外,一切都是一个实例。方法被附加到实例之上,并且被实例所调用。Function是实现了 FunctionNN trait (NN是指参数的个数,在 Scala 2.8 的文档中可知,NN 的取值范围是 1~22)的实例。在运行时函数没有什么特别的地方,但在编译阶段,有一些方式可以让编写一个函数使用很少的代码。
Partial Functions
Partial function 是只有部份参数被 apply 的函数,在Scala中,可以从方法中来构建 partially applied function:
scala> def plus(a: Int, b: Int) = "Result is: "+(a + b) plus: (a: Int,b: Int)java.lang.String scala> val p = (b: Int) => plus(42, b) p: (Int) => java.lang.String =
partial function 允许你基于已有的方法或函数来构建新的函数,参数可以用不同的括号来分组:
scala> def add(a: Int)(b: Int) = "Result is: "+(a + b) add: (a: Int)(b: Int)java.lang.String
这样,就可以用下面的語法来调用:
scala> add(1)(2) res1: java.lang.String = Result is: 3
通过这个語法,你可以传递一个独立于其它参数的代码快作为参数:
scala> add(1){
| val r = new java.util.Random
| r.nextInt(100)
| }
res2: java.lang.String = Result is: 15
同时,也允许很容易地将一个方法提升为一个partially applied function:
scala> def w42(f: Int => String) = f(42) w42: (f: (Int) => String)String scala> w42(add(1)) res5: String = Result is: 43
最后,也可以通过partially applying一个方法将它转换为一个函数:
scala> def f2 = add(1) _ f2: (Int) => java.lang.String
此时,这个函数也能被传递给另一个方法:
scala> w42(f2) res6: String = Result is: 43
Type Parameters
方法可以拥有类型参数:类型参数定义了其它的类型或方法的返回值类型。但注意函数不能接收类型参数,一个的参数和返回值必须在函数定义时创建。
评论