Latest web development tutorials

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

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.w3big
class HelloWorld

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

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