Scala基礎語法


如果您熟悉Java語言語法和程式設計,那麼學習Scala將會很容易。Scala和Java之間最大的句法差異在於行結束字元的分號(;) 是可選的。

當編寫Scala程式時,它可以被定義為通過呼叫彼此的方法進行通訊的物件的集合。現在我們簡單地看一下類,物件,方法和範例變數的含義。

  • 物件 - 物件有狀態和行為。一個物件是類的一個範例。例如 - 狗有狀態:顏色,名稱,品種,它行為有:搖擺,吠叫和吃東西。
  • - 可以將類定義為描述與該類相關的行為/狀態的模板/藍圖。
  • 方法 - 一個方法基本上是一種行為。一個類可以包含很多方法。將邏輯程式碼寫入的方法中,資料在方法中操縱並且執行所有的動作。
  • 欄位 - 每個物件都有其唯一的一組範例變數,稱為欄位。物件的狀態是由分配給這些欄位的值來建立的。
  • 閉包 - 閉包是一個函式,其返回值取決於在此函式之外宣告的一個或多個變數的值。
  • 特徵 - 特徵(Traits)封裝了方法和欄位定義,然後可以通過將它們混合到類中來重用它們,特徵(Traits)用於通過指定支援的方法的簽名來定義物件型別。

第一個Scala專案

我們可以通過兩種模式執行Scala程式:

  • 互動模式
  • 指令碼模式

1. 互動模式

開啟命令提示字元並使用以下命令開啟Scala

注意: 需要先下載: scala-2.12.x.tgz ,下載地址: http://downloads.lightbend.com/scala/2.12.3/scala-2.12.3.tgz ,並解壓到一個目錄,這裡解壓到:D:\software\

開啟命令提示字元進入到目錄:D:\software\scala-2.12.3\bin 執行如下命令執行程式 -

D:\software\scala-2.12.3\bin> scala
Welcome to Scala 2.12.3 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_65).
Type in expressions for evaluation. Or try :help.

scala> println("Hello, Scala!");
Hello, Scala!

scala>

2. 指令碼模式

使用以下說明在指令碼模式下編寫Scala程式。開啟記事本建立一個原始檔:HelloWorld.scala,儲存在目錄:D:\software\scala-2.12.3\bin 下,並在其中編寫以下程式碼 -

object HelloWorld {
   /* This is my first java program.  
   * This will print 'Hello World' as the output
   */
   def main(args: Array[String]) {
      println("Hello, world!") // prints Hello World
   }
}

開啟命令提示字元視窗並轉到儲存程式檔案的目錄。使用'scalac'命令編譯Scala程式,它將在當前目錄中生成一些類檔案。其中一個將被編譯生成為HelloWorld.class。 這是一個使用'scala'命令在Java虛擬機器(JVM)上執行的位元組碼。

使用以下命令來編譯和執行Scala程式及輸出結果如下 -

D:\software\scala-2.12.3\bin>scalac HelloWorld.scala

D:\software\scala-2.12.3\bin>scala HelloWorld
Hello, world!

D:\software\scala-2.12.3\bin>

基礎語法

以下是Scala程式設計中的基本語法和編碼約定。

  • 區分大小寫 - Scala是區分大小寫的,比如識別符號Hellohello在Scala中表示不同的含義(物件)。
  • 類名稱 - 對於所有類名,第一個字母應為大寫。如果使用多個單詞來形成類的名稱,則每個內部單詞的第一個字母應該是大寫。
    範例 - class MyFirstScalaClassclass Employee*類等。

  • 方法名稱 - 所有方法名稱應以小寫字母開頭。如果使用多個單詞形成方法的名稱,則每個內部單詞的第一個字母應為大寫。
    範例 - def myMethodName()def getName()等。

  • 程式檔案名 - 程式檔案的名稱應與物件名稱完全匹配。儲存檔案時,您應該使用物件名稱儲存它(記住Scala是區分大小寫的),並將.scala附加到檔案名稱的末尾。 (如果檔案名和物件名不匹配,則程式將不會編譯)。
    範例 - 假設HelloWorld是物件名稱。 那麼檔案應該儲存為HelloWorld.scala

  • def main(args:Array [String]) - Scala程式從main()方法開始,這是每個Scala程式的強制性部分。

Scala識別符號

所有Scala元件都需要名稱。用於物件,類,變數和方法的名稱稱為識別符號。關鍵字不能用作識別符號,識別符號區分大小寫。Scala支援四種型別的識別符號。

字母數位識別符號

字母數位識別符號以字母或下劃線開頭,後面可以有更多的字母,數位或下劃線。 $字元是Scala中的保留關鍵字,不應在識別符號中使用。

以下是合法的字母數位識別符號 -

age, salary, _value,  __1_value

以下是非法識別符號 -

$salary, 123abc, -salary

運算子識別符號

運算子識別符號由一個或多個運算子字元組成。運算子字元是可列印的ASCII字元,如:+:?~#

以下是合法運算子識別符號 -

+ ++ ::: <?> :>

Scala編譯器將在內部將操作符識別符號轉換成具有嵌入式$字元的合法Java識別符號。例如,識別符號:->將被內部表示為$colon$minus$greater

混合識別符號

混合識別符號由字母數位識別符號組成,後面跟著一個下劃線和一個操作符識別符號。

以下是合法的混合識別符號 -

unary_+,  myvar_=

這裡,一元_+用作方法名稱定義一個一元的+運算子,而myvar_=用作方法名定義一個賦值運算子(運算子過載)。

字面識別符

一個文字識別符號是一個隨意的字串,包含在後面的勾號(...)中。

以下是合法的文字識別符號 -

`x` `<clinit>` `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 {
   /* This is my first java program.  
    * This will print 'Hello World' as the output
    * This is an example of multi-line comments.
    */
   def main(args: Array[String]) {
      // Prints Hello World
      // This is also an example of single line comment.
      println("Hello, world!") 
   }
}

空行和空格

只包含空格的行(可能帶有注釋)稱為空行,Scala完全忽略它。標記可以由空格字元和/或註釋分隔。

換行字元

Scala是一種面向行的語言,其語句可能以分號(;)或換行符終止。語句結尾處的分號(;)通常是可選的。如果需要,您可以輸入一個分號(;),但如果語句在單行上自行顯示,則不需要輸入。 另一方面,如果在單行上寫多個語句,則需要分號。 下面的語法是多個語句的用法。

val s = "hello"; println(s)

Scala包

一個包是一個命名的程式碼模組。 例如,Lift實用程式包是net.liftweb.util。包宣告是原始檔中的第一個非註釋行,如下所示:

package com.liftcode.stuff

匯入Scala軟體包,以便在當前的編譯範圍內參照它們。 以下語句匯入scala.xml包的內容 -

import scala.xml._

也可以從scala.collection.mutable包匯入單個類和物件,例如:HashMap

import scala.collection.mutable.HashMap

可以從單個包匯入多個類或物件,例如,來自scala.collection.immutable包的TreeMapTreeSet -

import scala.collection.immutable.{TreeMap, TreeSet}

應用動態

一個能夠進行動態呼叫的標記特徵。此特徵的範例x允許方法呼叫x.meth(args)用於任意方法名稱和引數列表args以及對任意欄位名稱欄位的欄位存取x.field。此功能在Scala-2.10中引入。

如果呼叫不是由本機支援的(即,如果型別檢查失敗),則根據以下規則重寫:

foo.method("blah") ~~> foo.applyDynamic("method")("blah")
foo.method(x = "blah") ~~> foo.applyDynamicNamed("method")(("x", "blah"))
foo.method(x = 1, 2) ~~> foo.applyDynamicNamed("method")(("x", 1), ("", 2))
foo.field ~~> foo.selectDynamic("field")
foo.varia = 10 ~~> foo.updateDynamic("varia")(10)
foo.arr(10) = 13 ~~> foo.selectDynamic("arr").update(10, 13)
foo.arr(10) ~~> foo.applyDynamic("arr")(10)