# 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!
```
[在線實例 ?](/try/runcode.php?filename=HelloWorld2&type=scala)
## 基本語法
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.runoob
class HelloWorld
```
第二種方法有些類似 C#,如:
```
package com.runoob {
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.的。
- Scala 教程
- Scala 簡介
- Scala 安裝
- Scala 基礎語法
- Scala 數據類型
- Scala 變量
- Scala 訪問修飾符
- Scala 運算符
- Scala IF...ELSE 語句
- Scala 循環
- Scala while 循環
- Scala do...while 循環
- Scala do...while 循環
- Scala break 語句
- Scala 函數
- Scala 函數傳名調用(call-by-name)
- Scala 指定函數參數名
- Scala 函數 - 可變參數
- Scala 遞歸函數
- Scala 高階函數
- Scala 函數嵌套
- Scala 匿名函數
- Scala 偏應用函數
- Scala 函數柯里化(Currying)
- Scala 閉包
- Scala 字符串
- Scala 數組
- Scala Collection
- Scala List(列表)
- Scala Set(集合)
- Scala Map(映射)
- Scala 元組
- Scala Option(選項)
- Scala Iterator(迭代器)
- Scala 類和對象
- Scala Trait(特征)
- Scala 模式匹配
- Scala 正則表達式
- Scala 異常處理
- Scala 提取器(Extractor)
- Scala 文件 I/O