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)