Scala学习笔记(9)-函数和闭包

函数这块有很多简洁的用法,简洁的同时也带来了代码易阅读的问题,所以个人不特别建议大量使用,用兴趣的可以自己去搜搜看。

闭包:closure

函数文本在运行时创建的函数值(对象)被称为闭包:closure。名称源自于通过“捕获”自由变量的绑定对函数文本执行的“关闭”行动。不带自由变量的函数文本,如(x: Int) => x + 1,被称为封闭术语:closed term 。这个函数文本在运行时创建的函数值严格意义上来讲就不是闭包,因为(x: Int) => x + 1在编写的时候就已经封闭了。但任何带有自由变量的函数文本,如(x: Int) => x + more,(其中more为自由变量)都是开放术语:open term。

如果more在闭包创建之后被改变了会发生什么事?

闭包会看到闭包之外做出的对more的变化。反过来也同样。闭包对捕获变量作出的改变在闭包之外也可见。

def makeIncreaser(more: Int) = (x: Int) => x + more

函数每次被调用时都会创建一个新闭包。每个闭包都会访问闭包创建时活跃的more变量。

重复参数

Scala允许你指明函数的最后一个参数可以是重复的。这可以允许客户向函数传入可变长度参数列表。想要标注一个重复参数,在参数的类型之后放一个星号。如:

def echo(args: String*) = for (arg <- args) println(arg)

将数组的每一个元素当作参数,如:

val arr = Array("What's", "up", "doc?")

echo(arr: _*)//在数组参数后添加一个冒号和一个_*符号,告诉编译器把arr的每个元素当作参数

你可能感兴趣的:(Scala学习笔记(9)-函数和闭包)