Scala学习笔记(四)——函数和闭包

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wuqingdeqing/article/details/86617950

4.1 本地函数

类似Java中的私有方法,Scala的方式是把函数定义在别的函数之内。就好像本地变量那样,这种本地函数仅在包含它的代码块中可见。

4.2 头等函数

Scala的函数时头等函数。不仅可以定义和调用函数,还可以把它写成匿名的字面量,并把它作为值传递。

4.3 占位符语法

如果想让函数字面量更简洁,可以把下划线当做一个或更多参数的占位符,只要每个参数在函数字面量内只出现一次。比如,_>0检查值是否大于0.

4.4 部分应用函数

还可以用单个下划线替换整个参数列表,例如:

someNumbers.foreach(println _)

记住要在函数和下划线之间留一个空格。

4.5 闭包

不带自由变量的函数字面量,如(x :Int) => x + 1,被称为封闭项,这里项指的是一小部分源代码。因此依照这个函数字面量在运行时创建的函数值严格意义上来讲就不是闭包,因为它在编写时就已经封闭了。但任何带有自由变量的函数字面量,如(x : Int) => x + more,都是开放项。因此,任何以之为模板在运行期创建的函数值将必须捕获对自由变量more的绑定。因此得到的函数值将包含指向捕获的more变量的索引。又由于函数值是关闭这个开放项x : Int) => x + more的行动的最终产物,因此被称之为闭包。

4.6 重复参数

可以指明函数的最后一个参数是重复的,从而允许用户向函数传入可变长度参数列表。想要标注一个重复参数,可在参数的类型之后放一个*。

4.7 尾递归

Scala编译器检测到尾递归就用新值更新函数参数,然后把他替换成一个回到函数开头的跳转。因此,在Scala中尾递归无须付出任何运行时开销。

但尾调用优化限定了方法或嵌套函数必须在最后一个操作调用本身,而不是转到某个函数值或什么其他的中间函数的情况。

猜你喜欢

转载自blog.csdn.net/wuqingdeqing/article/details/86617950