Scala 基礎語法
如果你之前是一名Java 程序員,並了解Java 語言的基礎知識,那麼你能很快學會Scala 的基礎語法。
Scala 與Java 的最大區別是:Scala 語句末尾的分號; 是可選的。
我們可以認為Scala 程序是對象的集合,通過調用彼此的方法來實現消息傳遞。 接下來我們來理解下,類,對象,方法,實例變量的概念:
對象-對像有屬性和行為。例如:一隻狗的狀屬性有:顏色,名字,行為有:叫、跑、吃等。 對像是一個類的實例。
類-類是對象的抽象,而對像是類的具體實例。
方法-方法描述的基本的行為,一個類可以包含多個方法。
字段-每個對像都有它唯一的實例變量集合,即字段。對象的屬性通過給字段賦值來創建。
第一個Scala 程序
交互式編程
交互式編程不需要創建腳本文件,可以通過以下命令調用:
$ scala Welcome to Scala version 2.11.7 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_31). Type in expressions to have them evaluated. Type :help for more information. scala> 1 + 1 res0: Int = 2 scala> println("Hello World!") Hello World! scala>
腳本形式
我們也可以通過創建一個HelloWorld.scala 的文件來執行代碼,HelloWorld.scala 代碼如下所示:
object HelloWorld { /* 这是我的第一个 Scala 程序 * 以下程序将输出'Hello World!' */ def main(args: Array[String]) { println("Hello, world!") // 输出 Hello World } }
接下來我們使用scalac 命令編譯它:
$ scalac HelloWorld.scala $ ls HelloWorld$.class HelloWorld.scala HelloWorld.class
編譯後我們可以看到目錄下生成了HelloWorld.class 文件,該文件可以在Java Virtual Machine (JVM)上運行。
編譯後,我們可以使用以下命令來執行程序:
$ scala HelloWorld Hello, world!在線實例»
基本語法
Scala 基本語法需要注意以下幾點:
區分大小寫 - Scala是大小寫敏感的,這意味著標識Hello和hello在Scala中會有不同的含義。
類名 -對於所有的類名的第一個字母要大寫。
如果需要使用幾個單詞來構成一個類的名稱,每個單詞的第一個字母要大寫。
示例: class MyFirstScalaClass方法名稱 -所有的方法名稱的第一個字母用小寫。
如果若干單詞被用於構成方法的名稱,則每個單詞的第一個字母應大寫。
示例: def myMethodName()程序文件名 -程序文件的名稱應該與對象名稱完全匹配。
保存文件時,應該保存它使用的對象名稱(記住Scala是區分大小寫),並追加".scala"為文件擴展名。 (如果文件名和對象名稱不匹配,程序將無法編譯)。
示例: 假設"HelloWorld"是對象的名稱。 那麼該文件應保存為'HelloWorld.scala"def main(args: Array[String]) - Scala程序從main()方法開始處理,這是每一個Scala程序的強製程序入口部分。
標識符
Scala 可以使用兩種形式的標誌符,字符數字和符號。
字符數字使用字母或是下劃線開頭,後面可以接字母或是數字,符號"$"在Scala 中也看作為字母。 然而以"$"開頭的標識符為保留的Scala 編譯器產生的標誌符使用,應用程序應該避免使用"$"開始的標識符,以免造成衝突。
Scala 的命名規則採用和Java 類似的camel 命名規則,首字符小寫,比如toString。 類名的首字符還是使用大寫。 此外也應該避免使用以下劃線結尾的標誌符以避免衝突。 符號標誌符包含一個或多個符號,如+,:,? 等,比如:
+ ++ ::: < ?> :->
Scala 內部實現時會使用轉義的標誌符,比如:-> 使用$colon$minus$greater 來表示這個符號。 因此如果你需要在Java 代碼中訪問:->方法,你需要使用Scala 的內部名稱$colon$minus$greater。
混合標誌符由字符數字標誌符後面跟著一個或多個符號組成,比如unary_+ 為Scala 對+方法的內部實現時的名稱。 字面量標誌符為使用"定義的字符串,比如`x` `yield`。
你可以在"之間使用任何有效的Scala 標誌符,Scala 將它們解釋為一個Scala 標誌符,一個典型的使用為Thread 的yield 方法, 在Scala 中你不能使用Thread.yield()是因為yield 為Scala中的關鍵字, 你必須使用Thread.`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 { /* 这是一个 Scala 程序 * 这是一行注释 * 这里演示了多行注释 */ def main(args: Array[String]) { // 输出 Hello World // 这是一个单行注释 println("Hello, world!") } }
空行和空格
一行中只有空格或者帶有註釋,Scala 會認為其是空行,會忽略它。 標記可以被空格或者註釋來分割。
換行符
Scala是面向行的語言,語句可以用分號(;)結束或換行符。 Scala 程序裡,語句末尾的分號通常是可選的。 如果你願意可以輸入一個,但若一行里僅有一個語句也可不寫。 另一方面,如果一行里寫多個語句那麼分號是需要的。 例如
val s = "本教程"; println(s)
Scala 包
定義包
Scala 使用package 關鍵字定義包,在Scala將代碼定義到某個包中有兩種方式:
第一種方法和Java 一樣,在文件的頭定義包名,這種方法就後續所有代碼都放在該報中。 比如:
package com.w3big class HelloWorld
第二種方法有些類似C#,如:
package com.w3big { class HelloWorld }
第二種方法,可以在一個文件中定義多個包。
引用
Scala 使用import 關鍵字引用包。
import java.awt.Color // 引入Color import java.awt._ // 引入包内所有成员 def handler(evt: event.ActionEvent) { // java.awt.event.ActionEvent ... // 因为引入了java.awt,所以可以省去前面的部分 }
import語句可以出現在任何地方,而不是只能在文件頂部。 import的效果從開始延伸到語句塊的結束。 這可以大幅減少名稱衝突的可能性。
如果想要引入包中的幾個成員,可以使用selector(選取器):
import java.awt.{Color, Font} // 重命名成员 import java.util.{HashMap => JavaHashMap} // 隐藏成员 import java.util.{HashMap => _, _} // 引入了util包的所有成员,但是HashMap被隐藏了
注意:默認情況下,Scala總會引入java.lang._ 、 scala._和Predef._,這裡也能解釋,為什麼以scala開頭的包,在使用時都是省去scala.的。