如果您熟悉Java語言語法和程式設計,那麼學習Scala將會很容易。Scala和Java之間最大的句法差異在於行結束字元的分號(;
) 是可選的。
當編寫Scala程式時,它可以被定義為通過呼叫彼此的方法進行通訊的物件的集合。現在我們簡單地看一下類,物件,方法和範例變數的含義。
我們可以通過兩種模式執行Scala程式:
開啟命令提示字元並使用以下命令開啟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>
使用以下說明在指令碼模式下編寫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程式設計中的基本語法和編碼約定。
Hello
和hello
在Scala中表示不同的含義(物件)。類名稱 - 對於所有類名,第一個字母應為大寫。如果使用多個單詞來形成類的名稱,則每個內部單詞的第一個字母應該是大寫。
範例 - class MyFirstScalaClass
,class Employee
*類等。
方法名稱 - 所有方法名稱應以小寫字母開頭。如果使用多個單詞形成方法的名稱,則每個內部單詞的第一個字母應為大寫。
範例 - def myMethodName()
,def getName()
等。
程式檔案名 - 程式檔案的名稱應與物件名稱完全匹配。儲存檔案時,您應該使用物件名稱儲存它(記住Scala是區分大小寫的),並將.scala
附加到檔案名稱的末尾。 (如果檔案名和物件名不匹配,則程式將不會編譯)。
範例 - 假設HelloWorld
是物件名稱。 那麼檔案應該儲存為HelloWorld.scala
。
def main(args:Array [String]) - Scala程式從main()
方法開始,這是每個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中的保留字(關鍵字),這些保留字不能用作常數或變數或任何其他識別符號名稱。
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支援與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)
一個包是一個命名的程式碼模組。 例如,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
包的TreeMap
和TreeSet
-
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)