Scala中定义函数需要给出函数的名称、参数和函数体。只要函数不是递归的,就不需要指定返回类型。
1、默认参数和 带名参数
scala> def decorate(str: String, left: String ="[",right:String="]")=left + str + right
decorate: (str: String, left: String, right: String)String
scala> decorate("Hello")
res4: String = [Hello]
该函数有两个参数,left和right,带有默认值"["和"]"。
也可以在提供参数的时候指定参数的名称,如下。
scala> decorate("Hello","<<<",">>>")
res3: String = <<<Hello>>>
如下参数是带名参数
scala> decorate(str="Hello",left="<<<",right=">>>")
res5: String = <<<Hello>>>
2、变长参数
scala> def sum(args: Int*) = {
| var result = 0
| for(arg <- args) result += arg
| result
| }
sum: (args: Int*)Int
scala> val s = sum(1, 2, 3, 4, 5, 6)
s: Int = 21
参数被当做参数序列处理,需要追加:_*
scala> val s = sum(1 to 6:_*)
s: Int = 21
3、过程
如果函数体包含在花括号中但没有前面的=号,那么返回类型就是Unit,这样的函数被称为过程(procedure),过程不返回值。
scala> def box(s: String){// 没有“=”
| var border = "-" * s.length + "--\n"
| println(border + "|" + s + "|\n" + border)
| }
box: (s: String)Unit
scala> box("Scala")
-------
|Scala|
-------
声明返回类型的写法
scala> def box(s: String):Unit = {
| var border = "-" * s.length + "--\n"
| println(border + "|" + s + "|\n" + border)
| }
4、懒值
当val被声明为lazy时,它的初始化将会被推迟,直到我们首次对它取值。
scala> lazy val words = scala.io.Source.fromFile("/usr/share/dict/words").mkString //该函数的功能是打开指定路径/usr/share/dict/words下的内容
words: String = <lazy>
懒值是介于val和def的中间状态
val words = scala.io.Source.fromFile("/usr/share/dict/words").mkString // 在words被定义时即被取值
lazy val words = scala.io.Source.fromFile("/usr/share/dict/words").mkString // 在words被首次使用时取值
def words = scala.io.Source.fromFile("/usr/share/dict/words").mkString // 在每一次words被使用时取值