这篇文章是《scala编程》的笔记。
Scala基于java,是一种函数式编程+过程式编程的混合语言。
可以使用解释器交互执行,也可以编译成jar包。
变量
Scala 有两种变量, val (引用不可变)和 var(引用可变)
变量的定义和赋值语句是:
val msg2: java.lang.String = "Helloagain, world!"
msg2是变量名,java.lang.String是变量类型,用冒号分隔,等号后边是变量值。
以上赋值语句可以简化为如下所示,因为在Scala程序里java.lang类型的简化名都可使用:
val msg3: String = "Hello yet again,world!"
由于scala有类型推断: type inference能力,Scala能自动理解你省略的类型的能力:
val msg = "Hello, world!"
scala的赋值语句不像java一样返回变量本身,而返回的是一个空值(Unit,类似于java中的void)
函数
函数定义
函数定义的语句是:
def max(x: Int, y: Int): Int = {
if (x > y) x
else y
}
def是函数定义关键字,max(x: Int,y: Int)是函数名和参数,可以看出,scala的变量和变量名的组合都是 变量名:变量类型。:int是返回值类型。函数定义中,最后一条语句的返回值作为函数的返回值,所以不需要return语句。
如果函数是递归的、或者使用了return,你就必须显式地定义函数结果类型。然而在max的例子里,你可以不用写结果类型,编译器也能够推断它,同样,如果函数仅由一个句子组成,你可以可选地不写大括号。这样,你就可以把max函数写成这样:
defmax2(x: Int, y: Int) = if (x > y) x else y
对于没有返回值的函数,返回值类型应该指定为:Unit(大写的U)。 Scala 的 Unit 类型比较接近 Java 的 void 类型,而且实际上 Java 里每一个返回 void 的方法都被映射为 Scala 里返回 Unit 的方法。
函数的定义可嵌套:
def fun1():Unit = {
def fun2():Unit = {
}
fun2
}
fun2只在fun1中可见。
函数定义中的=不可少,如果没有=的话,scala会默认返回类型是Unit,这样,函数真正要返回的东西就被转换为Unit类型了。这样的函数被称名过程,如下所示:
def fun1(){printnl(this is a procedure)}
另一种定义一种函数的方式是函数文本: function literal,这是匿名函数的定义方式,如下所示:
arg=> println(arg)
=>左边的arg代表的是参数列表,如果有多个参数,就应该是(arg1,arg2)的形式,各个参数可以跟上类型,如arg:Int这样。=>右边代表的是函数体。函数文本一般用在需要传入函数作为参数的函数调用里。比如,foreach(下面会介绍),使用foreach的方法就是args.foreach(arg=> println(arg)),传入了一个函数文本,代表了对args(是个数组)每一个元素的处理方式。当然,既然要传入的是函数,也可以写成args.foreach(println),这其实是println_的简写方式。
函数注意事项
函数可以带有可变数量的参数,如:
scala>def echo(args: String*) =
for (arg <- args) println(arg)
args 的类型实际上是 Array[String],如果参数要传入给这个echo,应该这样echo(arr:_*)。
以前缀“unary_”开头的函数或方法,可以把操作数据放在操作符右边。如Float类的unary_-()函数,其对应的是一元操作符-,使用的时候可以是-2.0这样。
函数调用
调用函数的方式:
1. func(arg1,arg2)
2. 调用某对象的某个只带一个参数的函数时,如obj.fuc(arg),可以写成这种形式:obj fuc arg,这在for语句里特别有用,可以for (i <- 0 to 2){}这样。
使用函数
函数的使用:
作为