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被使用時取值