如果您熟悉Java語言語法和編程,那么學(xué)習(xí)Scala將會很容易。Scala和Java之間最大的句法差異在于行結(jié)束字符的分號(;) 是可選的。
當(dāng)編寫Scala程序時,它可以被定義為通過調(diào)用彼此的方法進行通信的對象的集合。現(xiàn)在我們簡單地看一下類,對象,方法和實例變量的含義。
我們可以通過兩種模式執(zhí)行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 執(zhí)行如下命令運行程序 -
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程序。打開記事本創(chuàng)建一個源文件: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
}
}
打開命令提示符窗口并轉(zhuǎn)到保存程序文件的目錄。使用'scalac'命令編譯Scala程序,它將在當(dāng)前目錄中生成一些類文件。其中一個將被編譯生成為HelloWorld.class。 這是一個使用'scala'命令在Java虛擬機(JVM)上運行的字節(jié)碼。
使用以下命令來編譯和執(zhí)行Scala程序及輸出結(jié)果如下 -
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中表示不同的含義(對象)。類名稱 - 對于所有類名,第一個字母應(yīng)為大寫。如果使用多個單詞來形成類的名稱,則每個內(nèi)部單詞的第一個字母應(yīng)該是大寫。
示例 - class MyFirstScalaClass,class Employee*類等。
方法名稱 - 所有方法名稱應(yīng)以小寫字母開頭。如果使用多個單詞形成方法的名稱,則每個內(nèi)部單詞的第一個字母應(yīng)為大寫。
示例 - def myMethodName(),def getName()等。
程序文件名 - 程序文件的名稱應(yīng)與對象名稱完全匹配。保存文件時,您應(yīng)該使用對象名稱保存它(記住Scala是區(qū)分大小寫的),并將.scala附加到文件名稱的末尾。 (如果文件名和對象名不匹配,則程序?qū)⒉粫幾g)。
示例 - 假設(shè)HelloWorld是對象名稱。 那么文件應(yīng)該保存為HelloWorld.scala。
def main(args:Array [String]) - Scala程序從main()方法開始,這是每個Scala程序的強制性部分。
所有Scala組件都需要名稱。用于對象,類,變量和方法的名稱稱為標識符。關(guān)鍵字不能用作標識符,標識符區(qū)分大小寫。Scala支持四種類型的標識符。
字母數(shù)字標識符
字母數(shù)字標識符以字母或下劃線開頭,后面可以有更多的字母,數(shù)字或下劃線。 $字符是Scala中的保留關(guān)鍵字,不應(yīng)在標識符中使用。
以下是合法的字母數(shù)字標識符 -
age, salary, _value, __1_value
以下是非法標識符 -
$salary, 123abc, -salary
運算符標識符
運算符標識符由一個或多個運算符字符組成。運算符字符是可打印的ASCII字符,如:+,:,?,~或#。
以下是合法運算符標識符 -
+ ++ ::: <?> :>
Scala編譯器將在內(nèi)部將操作符標識符轉(zhuǎn)換成具有嵌入式$字符的合法Java標識符。例如,標識符:->將被內(nèi)部表示為$colon$minus$greater。
混合標識符
混合標識符由字母數(shù)字標識符組成,后面跟著一個下劃線和一個操作符標識符。
以下是合法的混合標識符 -
unary_+, myvar_=
這里,一元_+用作方法名稱定義一個一元的+運算符,而myvar_=用作方法名定義一個賦值運算符(運算符重載)。
字面識別符
一個文字標識符是一個隨意的字符串,包含在后面的勾號(...)中。
以下是合法的文字標識符 -
`x` `<clinit>` `yield`
以下列表顯示Scala中的保留字(關(guān)鍵字),這些保留字不能用作常量或變量或任何其他標識符名稱。
| 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是一種面向行的語言,其語句可能以分號(;)或換行符終止。語句結(jié)尾處的分號(;)通常是可選的。如果需要,您可以輸入一個分號(;),但如果語句在單行上自行顯示,則不需要輸入。 另一方面,如果在單行上寫多個語句,則需要分號。 下面的語法是多個語句的用法。
val s = "hello"; println(s)
一個包是一個命名的代碼模塊。 例如,Lift實用程序包是net.liftweb.util。包聲明是源文件中的第一個非注釋行,如下所示:
package com.liftcode.stuff
導(dǎo)入Scala軟件包,以便在當(dāng)前的編譯范圍內(nèi)引用它們。 以下語句導(dǎo)入scala.xml包的內(nèi)容 -
import scala.xml._
也可以從scala.collection.mutable包導(dǎo)入單個類和對象,例如:HashMap,
import scala.collection.mutable.HashMap
可以從單個包導(dǎo)入多個類或?qū)ο螅?,來?code>scala.collection.immutable包的TreeMap和TreeSet -
import scala.collection.immutable.{TreeMap, TreeSet}
一個能夠進行動態(tài)調(diào)用的標記特征。此特征的實例x允許方法調(diào)用x.meth(args)用于任意方法名稱和參數(shù)列表args以及對任意字段名稱字段的字段訪問x.field。此功能在Scala-2.10中引入。
如果調(diào)用不是由本機支持的(即,如果類型檢查失敗),則根據(jù)以下規(guī)則重寫:
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)