标签:
1. scala 的函数的参数默认都是val类型的
2. _ 参数占位符
3. 偏应用函数,类似于python 函数赋值到另外一个变量:
def sum(a,b,c): return a+b+c sum(1,2,3) // 输出6 a = sum a(1,2,3) // 输出6
在scala中:
def sum(a:Int, b:Int, c:Int) = a + b + c sum(1,2,3) // 输出6 val a = sum _ a(1,2,3) //输出6
val c = a
c(1,2,3) //输出6
还可以这样用 val b = sum(1, _: Int, 3); b(2) // 输出6
4. 闭包
短文本函数(x:Int)=> x>0, 现在考虑这种情况的短文本函数: (x:Int)=> x>more
more是什么呢? more应该是一个变量,但是没有在该函数文本中定义。x 是一个绑定变量,因为其在函数文本中有定义
与python中类似,闭包返回的是一个函数值,这个函数值的文本中访问了该闭包的局部变量,如
def makeIncreaser(more: Int) = (x: Int) => x + more
闭包makeIncreaser 返回函数值 (x: Int) => x + more, 该函数值访问了闭包的变量more
scala> val inc1 = makeIncreaser(1)
inc1: (Int) => Int = <function>
scala> val inc9999 = makeIncreaser(9999)
inc9999: (Int) => Int = <function>
创建了两个函数。 尽管more 是一个已经返回的函数调用的参数,scala编译器会在堆中重新安排1 和 9999的存在以让返回的函数值去捕获。 除了参数还可以是任意val,var。
5. 变长参数
def func(fmt:String, args:Type*) ....
用 args:Type*表示变长部分,在函数内部,args 会被当做 Array[Type]
调用时候 : func("format", a , b)
或者 : func("format", array: _*) 用 _* 表示把array展开。
类似于python中: def func(fmt, *args): pass
func(fmt, *argList) // py中吧*args 当做tuple
6. 尾递归
在递归函数最后一个动作调用自己的函数,被称为尾递归:tail recursive。Scala编译器检测到尾递归就用新值更新函数参数,然后把它替换成一个回到函数开头的跳转。 注意最后一个动作是调用自身,甚至连自身的偏应用函数都不行。
标签:
原文地址:http://www.cnblogs.com/kuipertan/p/4470841.html