1. 程式人生 > >Scala 混入、高階函式

Scala 混入、高階函式

使用混入組合類

用於組合類的特質稱為混入。

abstract class A {
    val message: String
}
class B extends A {
    val message = "I'm an instance of class B"
}
trait C extends A {
    def loudMessage = message.toUpperCase()
}
class D extends B with C

note:類D具有超類B,與混入C。

類只能有一個超類但是可以有多個混入(分別使用關鍵字extends與關鍵字with)。混入與超類具有相同的超型別。

高階函式

高階函式將其他函式作為引數或返回一個函式作為結果。因為Scala中,函式是第一類值,所以這是可能的。

# 高階函式map()
val salaries = Seq(20000, 70000, 40000)
val doubleSalary = (x: Int)=> x * 2
val newSalaries = salaries.map(doubleSalary)

# 匿名函式傳入高階函式(編譯器會自動推斷引數型別,無需宣告引數型別)
val ss = salaries.map(x =>x*2)


# 使用_代替引數
val sss = salaries.map(_*3)

1 方法轉為函式

由於Scala編譯器可以將方法轉為函式,所以,可以將方法作為引數傳給高階函式。

case class WeeklyWeatherForecast(temperatures: Seq[Double]) {
    private def converCtoF(temp: Double) = temp * 1.8 + 32
    def forecastInFahrenheit: Seq[Double] = temperatures.map(converCtoF)
}

note:編譯器會根據converCtoF方法自動生成一個對應函式。

2 接收函式的函式

使用高階函式的一個理由便是減少冗餘程式碼。

3 返回函式的函式

使用高階函式生成函式用於一些特定的情境,例如生成URL。

val domainName = "www.example.com"
def getURL = urlBuilder(ssl=true, domainName)
val endpoint = "users"
val query = "id=1"
val url = getURL(endpoint, query)