宣告

  • var

  • val: 由val宣告的變數,一旦指定值,就不可以再重新指定別的值給它

轉型

  • asInstanceOf

  • toXXX 一般數值
scala> var x = 1
x: Int = 1

scala> var y = 2L
y: Long = 2

scala> x = y.asInstanceOf[Int]
x: Int = 2

scala> x = y.toInt
x: Int = 2

在Scala中,==、!=是用來比較兩個物件內容值是否相同(這與Java不同,Java的==、!=是用來比較兩個參考是否為同一實例),例如Scala的List類別定義,若內含元素序列相同,則==傳回true

println(List(1, 2, 3) == List(1, 2, 3))

如果你要比較兩個參考實際上是否為同一實例,可以使用eq方法或ne方法,例如以下傳回false

println(List(1, 2, 3) eq List(1, 2, 3))

::

val x = List(1, 2)
println(0 :: x)

# print 0, 1, 2

Method

def gcd(m: Int, n: Int): Int = {
    if(n == 0) 
        m 
    else 
        gcd(n, m % n)
}

def gcd(m: Int, n: Int): Int = if(n == 0) m else gcd(n, m % n)

如果你的函式沒有傳回值,則無需使用等號,則可以宣告為Unit。例如:

def max(m: Int, n: Int): Unit = {
    if (m > n) 
        println(m)
    else 
        println(n)
}

// equal

def max(m: Int, n: Int) {
    if (m > n) 
        println(m)
    else 
        println(n)
}

Object

在Scala中,如果要建立單例物件(Singleton object),可以使用object關鍵字,例如:

object StringUtil {
    def rightPad(s: String, n: Int) = String.format("%1\$-" + n + "s", s)
    def leftPad(s: String, n: Int) = String.format("%1\$" + n + "s", s)
}

println(StringUtil.rightPad("Justin",  10))
println(StringUtil.leftPad("Justin",  10))

注 意上面這個程式不是定義類別,StringUtil並非類別名稱,你也沒辦法建構StringUtil實例。程式會建立一個物件,由StringUtil 名稱參考住(技術上來說,在編譯為位元碼後,Scala會產生一個StringUtil$類別,並建立一個物件由StringUtil名稱參考住)。

像上面的單例物件為獨立物件(Stand-alone object)。單例物件的另一個應用,就是與同名類別形成伴侶(Companion)。例如,若你想要某個自行設計的類別,在應用程式只會產生唯一實例,則可以如下設計:

class Resource private {
    def service(request: String) = request + "...processed..."
}

object Resource {
    private val resource = new Resource
    def get = resource
}

在Scala中,伴侶類別與伴侶物件必須位在同一個.scala檔案中

事實上,你無需定義get方法,你可以定義一個apply方法,這稱之為工廠方法(Factory method),例如:

class Resource private {
    def service(request: String) = request + "...processed..."
}

object Resource {
    private val resource = new Resource
    def apply() = resource
}


val resource = Resource()
println(resource.service("XD"))

For

args是個字串陣列,for括號中的「arg<-args」是一個產生器(Generator)語法,它會迭代整個陣列,每一次取出陣列中一個元素並設定給arg,要注意的是,雖然沒有明確寫出,不過arg事實上是val所宣告的變數,你不可以在for運算式本體中改變arg的參考。雖然沒有必要,不過你要寫明arg是個val也是可以的:

for(val arg <- args) {
    println(arg)
}

for(c <- "Scala") {
    println(c) // 每行顯示一個字元
}

for(j <- 1 to 9) { 
    for(i <- 2 to 9) { 
        printf("%d*%d=%2d ",i, j,  i * j)
    } 
    println()
}

Foreach

"Scala".foreach((c: Char) => println(c)) // 每行顯示一個字元

Option

results matching ""

    No results matching ""