Scala 基礎語法


如果你之前是 Java 程式設計師,並且了解 Java 語言的基礎知識,那麼你很快就能學會 Scala 的基礎語法。

Scala 與 Java 的最大差異是:Scala 語句末尾的分號 ; 是可選的。

我們可以認為 Scala 程式是物件的集合,透過呼叫彼此的方法來實現訊息傳遞。接下來我們來理解下,類,對象,方法,實例變數的概念:

  • 對象 - 物件有屬性和行為。例如:一隻狗的狀屬性有:顏色,名字,行為有:叫、跑、吃等。物件是一個類別的實例。

  • 類別 - 類別是物件的抽象,而物件是類別的具體實例。

  • 方法 - 方法描述的基本的行為,一個類別可以包含多個方法。

  • 欄位 - 每個物件都有它唯一的實例變數集合,即欄位。物件的屬性透過給字段賦值來創建。


第一個Scala 程式

互動式程式設計

互動式程式設計不需要建立腳本文件,可以透過以下命令呼叫:

$ scala
Welcome to Scala version 2.11.7 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_31).
Type in expressions to have them evaluated.
Type :help for more information.

scala> 1 + 1
res0: Int = 2

scala> println("Hello World!")
Hello World!

scala>

腳本形式

我們也可以透過建立一個HelloWorld.scala 的檔案來執行程式碼,HelloWorld.scala 程式碼如下所示:

object HelloWorld {
   /* 这是我的第一个 Scala 程序
    * 以下程序将输出'Hello World!' 
    */
   def main(args: Array[String]) {
      println("Hello, world!") // 输出 Hello World
   }
}

接下來我們使用scalac 命令編譯它:

$ scalac HelloWorld.scala 
$ ls
HelloWorld$.class	HelloWorld.scala
HelloWorld.class

編譯後我們可以看到目錄下產生了HelloWorld.class 文件,該文件可以在Java Virtual Machine (JVM)上運行。

編譯後,我們可以使用以下指令來執行程式:

$ scala HelloWorld
Hello, world!
線上實例»

基本語法

Scala 基本語法需要注意以下幾點:

  • 區分大小寫 -  Scala是大小寫敏感的,這表示標識Hello 和hello在Scala中會有不同的意義。

  • 類別名稱 - 對於所有的類別名稱的第一個字母要大寫。

    如果需要使用幾個單字來構成一個類別的名稱,每個單字的第一個字母要大寫。

    範例:class MyFirstScalaClass

  • #方法名稱 - 所有的方法名稱的第一個字母都用小寫。

    如果若干單字被用來構成方法的名稱,則每個單字的第一個字母應大寫。

    範例:def myMethodName()

  • #程式檔案名稱 - 程式檔案的名稱應該與物件名稱完全匹配。

    儲存檔案時,應該儲存它使用的物件名稱(記住Scala是區分大小寫),並追加".scala"為檔案副檔名。 (如果檔案名稱和物件名稱不匹配,程式將無法編譯)。

    範例: 假設"HelloWorld"是物件的名稱。那麼該檔案應儲存為'HelloWorld.scala"

  • def main(args: Array[String]) - Scala程式從main()方法開始處理,這是每一個Scala程式的強製程式入口部分。


標識符

Scala 可以使用兩種形式的標誌符,字元數字和符號。

字元數字使用字母或是底線開頭,後面可以接字母或是數字,符號"$"在 Scala 中也看作為字母。然而以"$"開頭的標識符為保留的 Scala 編譯器產生的標誌符使用,應用程式應避免使用"$"開始的標識符,以免造成衝突。

Scala 的命名規則採用和 Java 類似的 camel 命名規則,首字符小寫,例如 toString。類別名稱的首字符還是使用大寫。此外也應該避免使用以下劃線結尾的標誌符號以避免衝突。符號標誌符包含一個或多個符號,如+,:,? 等,例如:

+ ++ ::: < ?> :->

Scala 內部實作時會使用轉義的標誌符,例如:-> 使用$colon$minus$ greater 來表示這個符號。因此如果你需要在 Java 程式碼中存取:->方法,你需要使用 Scala 的內部名稱 $colon$minus$greater。

混合標誌符由字元數字標誌符後面跟著一個或多個符號組成,例如 unary_+ 為 Scala 對+方法的內部實作時的名稱。字面量標誌符為使用"定義的字串,例如`x` `yield`。

你可以在"之間使用任何有效的Scala 標誌符,Scala 將它們解釋為一個Scala 標誌符,一個典型的使用為Thread 的yield 方法, 在Scala 中你不能使用Thread.yield()是因為yield 為Scala 中的關鍵字, 你必須使用Thread.`yield`()來使用這個方法。


Scala 關鍵字

下表列出了scala 保留關鍵字,我們不能使用以下關鍵字作為變數:

## elseextendsfalse#finalfinally#forforSomeifimplicitimportlazymatch#newnullobjectoverridepackageprivateprotectedreturnsealed#superthisthrowtraittrytrue#typeval##var# ##:<-
abstractcasecatchclass
def
#whilewithyield
-
=
=>
###<:######<%## ####>:###################@######################## #######

Scala 註解

Scala 類似 Java 支援單行很多行註解。多行註釋可以嵌套,但必須正確嵌套,一個註釋開始符號對應一個結束符號。註釋在Scala 編譯中會被忽略,實例如下:

object HelloWorld {
   /* 这是一个 Scala 程序
    * 这是一行注释
    * 这里演示了多行注释
    */
   def main(args: Array[String]) {
      // 输出 Hello World
      // 这是一个单行注释
      println("Hello, world!") 
   }
}

空行和空格

一行中只有空格或帶有註釋,Scala 會認為其是空行,會忽略它。標記可以被空格或註釋來分割。


換行符號

Scala是一個面向行的語言,語句可以用分號(;)結束或換行符號。 Scala 程式裡,語句末尾的分號通常是可選的。如果你願意可以輸入一個,但若一行裡僅 有一個語句也可不寫。另一方面,如果一行裡寫多個語句那麼分號是需要的。例如

val s = "php中文网"; println(s)

Scala 套件

定義套件

Scala 使用package 關鍵字定義套件,在Scala將程式碼定義到某個套件中有兩種方式:

第一種方法和Java 一樣,在檔案的頭定義包名,這種方法就後續所有程式碼都放在該報中。 例如:

package com.php
class HelloWorld

第二種方法有些類似 C#,如:

package com.php {
  class HelloWorld 
}

第二種方法,可以在一個檔案中定義多個套件。

引用

Scala 使用 import 關鍵字引用套件。

import java.awt.Color  // 引入Color
 
import java.awt._  // 引入包内所有成员
 
def handler(evt: event.ActionEvent) { // java.awt.event.ActionEvent
  ...  // 因为引入了java.awt,所以可以省去前面的部分
}

import語句可以出現在任何地方,而不是只能在檔案頂端。 import的效果從開始延伸到語句區塊的結束。這可以大幅減少名稱衝突的可能性。

如果想要引入套件中的幾個成員,可以使用selector(選取器):

import java.awt.{Color, Font}
 
// 重命名成员
import java.util.{HashMap => JavaHashMap}
 
// 隐藏成员
import java.util.{HashMap => _, _} // 引入了util包的所有成员,但是HashMap被隐藏了

注意:預設情況下,Scala 總是會引入java.lang._ 、 scala._ 和Predef._,這裡也能解釋,為什麼以scala開頭的包,在使用時都是省去scala.的。

#