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 代碼如下所示:

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 保留關鍵字,我們不能使用以下關鍵字作為變量:

abstract case catch class
def do else extends
false final finally for
forSome if implicit import
lazy match new null
object override package private
protected return sealed super
this throw trait try
true type val var
while with yield  
- : = =>
<- <: <% >:
# @

Scala 注釋

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

object HelloWorld {
   /* 這是一個 Scala 程序
    * 這是一行注釋
    * 這裏演示了多行注釋
    */
   def main(args: Array[String]) {
      // 輸出 Hello World
      // 這是一個單行注釋
      println("Hello, world!") 
   }
}

空行和空格

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


換行符

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

val s = "菜鳥教程"; println(s)

Scala 包

定義包

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

第一種方法和 Java 一樣,在文件的頭定義包名,這種方法就後續所有代碼都放在該包中。 比如:

package com.runoob
class HelloWorld

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

package com.runoob {
  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.的。