Scala函数式编程_function & method
Function 和 Method 传递性上的区别
method——指的是在trait、class、object中以def关键字声明的,它不能被直接传递。
function——类型为 ParamsType=>ResultType 的变量,这些变量背后是用 FunctionN 对象来封装的 ,可以被传递。同时,方法也可以转换成函数。
做个测试,如下,启动scala shell,
scala> val increase = (x: Int) => x + 1
increase: Int => Int = <function1>
scala> val increase = (x: Int) => x + 1
increase: Int => Int = <function1>
scala> val add = (x: Int,y: Int) => x + y
add: (Int, Int) => Int = <function2>
scala>
可以看到,变量increase(一个匿名函数并赋值给变量),是用 function1 来封装的。其类型为 Int => Int。
如下赋值给变量的匿名函数,
scala> val add = (x: Int,y: Int,z: Int) => x + y + z
add: (Int, Int, Int) => Int = <function3>
scala> val add123 = (x: Int,y: Int,z: Int) => x + y + z
add123: (Int, Int, Int) => Int = <function3>
scala>
这两个赋值给变量的匿名函数都是用 function3 函数对象来封装的,其类型为 (Int, Int, Int) => Int
这样封装的意义就是 其可传递性。如果函数定义的参数超过22 个,就不会被封装成函数对象,如下,
scala> val add3 = (a:Int,b:Int,c:Int,d:Int,e:Int,f:Int,g:Int,h:Int,i:Int,j:Int,k:Int,l:Int,m:Int,n:Int,o:Int,p:Int,q:Int,r:Int,s:Int,t:Int,u:Int,v:Int,w:Int,x:Int) =>
| a+b+c+d+e+f+g+h+i+j+k+l+m+n+o+p+q+r+s+t+u+v+w+x
<console>:7: error: implementation restricts functions to 22 parameters
val add3 = (a:Int,b:Int,c:Int,d:Int,e:Int,f:Int,g:Int,h:Int,i:Int,j:Int,k:Int,l:Int,m:Int,n:Int,o:Int,p:Int,q:Int,r:Int,s:Int,t:Int,u:Int,v:Int,w:Int,x:Int) =>
^
scala>
implementation restricts functions to 22 parameters。
匿名函数的参数个数大于 22 个,不能用 FunctionN 来封装。但方法的参数可以大于 22 个。
如下,用def 定义一个方法,
scala> def add(a:Int,b:Int,c:Int,d:Int,e:Int,f:Int,g:Int,h:Int,i:Int,j:Int,k:Int,l:Int,m:Int,n:Int,o:Int,p:Int,q:Int,r:Int,s:Int,t:Int,u:Int,v:Int,w:Int,x:Int) = {
| a+b+c+d+e+f+g+h+i+j+k+l+m+n+o+p+q+r+s+t+u+v+w+x
| }
add: (a: Int, b: Int, c: Int, d: Int, e: Int, f: Int, g: Int, h: Int, i: Int, j: Int, k: Int, l: Int, m: Int, n: Int, o: Int, p: Int, q: Int, r: Int, s: Int, t: Int, u: Int, v: Int, w: Int, x: Int)Int
参数的个数已经24 个。
============END============
来源:oschina
链接:https://my.oschina.net/u/1469576/blog/362279