Scala系統學習(三):Scala基礎語法
如果您熟悉Java語言語法和編程,那麽學習Scala將會很容易。Scala和Java之間最大的句法差異在於行結束字符的分號(;
) 是可選的。
當編寫Scala程序時,它可以被定義為通過調用彼此的方法進行通信的對象的集合。現在我們簡單地看一下類,對象,方法和實例變量的含義。
- 對象 - 對象有狀態和行為。一個對象是類的一個實例。例如 - 狗有狀態:顏色,名稱,品種,它行為有:搖擺,吠叫和吃東西。
- 類 - 可以將類定義為描述與該類相關的行為/狀態的模板/藍圖。
- 方法 - 一個方法基本上是一種行為。一個類可以包含很多方法。將邏輯代碼寫入方法中,數據在方法中操縱並且執行所有的動作。
- 字段 - 每個對象都有其唯一的一組實例變量,稱為字段。對象的狀態是由分配給這些字段的值來創建的。
- 閉包 - 閉包是一個函數,其返回值取決於在此函數之外聲明的一個或多個變量的值。
- 特征 - 特征(Traits)封裝了方法和字段定義,然後可以通過將它們混合到類中來重用它們,特征(Traits)用於通過指定支持的方法的簽名來定義對象類型。
第一個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是區分大小寫的,比如標識符
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支持四種類型的標識符。
字母數字標識符
字母數字標識符以字母或下劃線開頭,後面可以有更多的字母,數字或下劃線。 $
字符是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
包的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)
Scala系統學習(三):Scala基礎語法