《Programming in Scala 3rd》阅读笔记

Chapter 08 《Functions and Closur

2018-06-13  本文已影响5人  liqing151

方法

局部函数

一等函数

部分应用函数
def sum(a: Int, b: Int, c: Int) = a + b + c
val a = sum _

使用方法a(1,2,3),编译器从sum _生成了类,又生成了实例赋值给a。该类带有一个接收三个参数的apply函数,因为sum _缺失的参数为3个。编译器将a(1,2,3)编译成为对apply函数的调用,a(1,2,3)=>a.apply(1,2,3)val b = sum(1, _: Int, 3)生成了只传递一个参数的apply函数。(这一章节有些概念不是很明白,比如list.foreach(println _)=>list.foreach(println)


闭包
def makeIncreaser(more: Int) = (x: Int) => x + more
scala> val inc1 = makeIncreaser(1)
inc1: Int => Int = <function1>
scala> val inc9999 = makeIncreaser(9999)
inc9999: Int => Int = <function1>

创建了两个闭包。当调用

scala> inc1(10)
res20: Int = 11
scala> inc9999(10)
res21: Int = 10009

虽然more被传入的方法makeIncreaser已经结束,但是编译器保证被捕获的参数依然在堆上存活着。


特殊的函数调用形式

支持重复参数,带名字的参数以及缺省参数。

scala> def echo(args: String*) = for (arg <- args) println(arg)
scala> val arr = Array("What's", "up", "doc?")
scala> echo(arr: _*) //将arr中的每个元素分别传递给echo,而不是将其当做一个整体传递。

尾递归
上一篇下一篇

猜你喜欢

热点阅读