Scala 學習(2)之「函數」

有返回值函數

def 函數名(參數名 : 參數類型): 返回值類型 = {

// 函數體

}

無返回值函數

// 不聲明返回值類型的函數前提是右側函數體不包含遞歸的語句

def 函數名(參數名 : 參數類型) = {

// 函數體

}


// 又或者

def 函數名(參數名 : 參數類型): Unit = {

// 函數體

}

默認參數

def sayHello(firstName:String, middleName:String = "William", lastName:String = "Croft") : String = {

firstName + " " + middleName + " " + lastName

}

// 如果給出的參數不夠,則會從左往右依次應用參數

命名參數

sayHello("Mick", lastName = "Mike", middleName = "Jack")

// 可以混合使用未命名參數和帶名參數,但是未命名參數必須排在帶名參數前面

變長參數

def sum(nums : Int*) = {

var res = 0

for (num

res

}

使用序列調用變長參數

// 冒號跟下劃線之間有空格

val s = sum(1 to 5 : _*)

使用遞歸函數實現累加

def sum(nums : Int*):Int = {

if(nums.length == 0) 0

else nums.head + sum(nums.tail : _*)

}

過程

如果函數體直接包裹在了花括號裡面,而沒有使用 = 連接,則函數的返回值類型就是 Unit 。這樣的函數就被稱之為

過程。過程通常用於不需要返回值的函數。

def sayHello(name: String) = "Hello, " + namedef sayHello(name: String) {

print("Hello, " + name);"Hello, " + name

}

// 過程還有一種寫法,就是將函數的返回值類型定義為 Unit

def sayHello(name: String) : Unit = "Hello, " + name

Lazy

如果將一個變量聲明為 lazy ,則只有在第一次使用該變量時,變量對應的表達式才會發生計算。這種特性對於特別耗時的計算操作特別有用,比如打開文件進行磁盤 IO ,進行網絡 IO 等。

import scala.io.Source._

// mkString代表將 BufferedSource 轉換成文本

lazy val lines = fromFile("C://Users//Administrator//Desktop//test.txt").mkString

異常

try {

// 捕捉異常

throw new IllegalArgumentException("x should not be negative")

} catch {

// 出現異常之後該怎麼做

case _: IllegalArgumentException => println("Illegal Argument!")

} finally {

// 無論是否發生異常,都會進行的操作,通常用來釋放資源,關閉連接等

print("release resources!")

}try {

throw new IOException("user defined exception")

} catch {

// 根據不同的異常類別進行不同的處理

case e1: IllegalArgumentException => println("illegal argument")

case e2: IOException => println("io exception")

}

歡迎關注,本號將持續分享本人在編程路上的各種見聞。


分享到:


相關文章: