Scala基礎教程(二):資料型別、變數
基礎語法
關於Scala程式,這是非常要注意以下幾點。
· 區分大小寫 - Scala是大小寫敏感的,這意味著標識Hello 和 hello在Scala中會有不同的含義。
· 類名 - 對於所有的類名的第一個字母要大寫。
如果需要使用幾個單詞來構成一個類的名稱,每個單詞的第一個字母要大寫。
示例:classMyFirstScalaClass
· 方法名稱 - 所有的方法名稱的第一個字母用小寫。
如果若干單詞被用於構成方法的名稱,則每個單詞的第一個字母應大寫。
示例:defmyMethodName()
· 程式檔名 - 程式檔案的名稱應該與物件名稱完全匹配。
儲存檔案時,應該儲存它使用的物件名稱(記住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_=
在這裡,作為一個方法名unary_+定義了一個一元+運算子和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}
Scala的資料型別全部相同於Java中,具有相同的記憶體佔用和精度。以下表是有關可在Scala中所有的資料型別的細節:
資料型別 |
描述 |
Byte |
8位有符號值。範圍從-128到127 |
Short |
16位有符號值。範圍從-32768至32767 |
Int |
32 位有符號值。範圍從 -2147483648 to 2147483647 |
Long |
64位有符號值。從-9223372036854775808到9223372036854775807 |
Float |
32位IEEE754單精度浮點數 |
Double |
64位IEEE754雙精度浮點數 |
Char |
16位無符號Unicode字元。範圍由U+0000至U+FFFF |
String |
字元序列 |
Boolean |
無論是字面true或false字面 |
Unit |
對應於沒有值 |
Null |
空或空引用 |
Nothing |
每一個其他型別的子型別; 包括無值 |
Any |
Any型別的超型別;任何物件是任何型別 |
AnyRef |
任何引用型別的超型別 |
上面列出的所有的資料型別是物件。沒有原始的型別,如Java中。這意味著可以呼叫int,long等上的方法
Scala基本字面值:
Scala中使用的文字規則是簡單和直觀的。這部分解釋了所有Scala中的基本文字。
整數值
整數文字通常是int型別,或型別龍其次是L或l字尾的時候。下面是一些整數文字:
0
035
21
0xFFFFFFFF
0777L
浮點型
浮點文字是Float型別後跟一個浮點型別字尾F或f時,否則是Double型別。下面是一些浮點文字:
0.0
1e30f
3.14159f
1.0e100
.1
布林型別
布林字面值true和false是Boolean型別的成員。
符號字面值
符號常量'x是簡寫的表達scala.Symbol(“X”)。Symbol是一個類,它的定義如下。
package scala
final case class Symbol private (name: String) {
override def toString: String = "'" + name
}
字元
字元文字是用引號括起來的單個字元。該字元是一個可列印的Unicode字元或轉義序列描述。這裡有一些字元文字:
'a'
'u0041'
'
'
' '
字串常量
字串常量是在雙引號中的字元序列。字元或者是可列印Unicode字元或轉義序列描述。下面是一些字串:
"Hello,
World!"
"This string contains a " character."
多行字串
多行字串是包含在三重引號“”字元序列“...”“”。字元序列是任意的,不同之處在於它可以包含三個或更多個連續引號字元僅在未尾。
字元未必是可列印;新的一行或其他控制字元也是允許的。這裡是一個多行字串:
"""the present string
spans three
lines."""
NULL值
null是scala.Null型別一個值,因此這個引用型別相容。它表示參考值是指一種特殊的“空”的物件。
轉義序列:
以下轉義序列在字元和字串。
轉義序列 |
Unicode |
描述 |
u0008 |
退格BS |
|
u0009 |
水平製表符HT |
|
u000c |
換頁FF |
|
f |
u000c |
換頁FF |
u000d |
回車CR |
|
" |
u0022 |
雙引用 " |
' |
u0027 |
單引用 . |
\ |
u005c |
反斜線 |
介於0和255字元使用Unicode也可以通過一個八進位制轉義,也就是說,一個反斜槓“”之後的最多三個八進位制字元的序列表示。以下為例子來說明一些轉義字元序列:
object Test {
def main(args: Array[String]) {
println("Hello World
" );
}
}
當上述程式碼被編譯和執行時,它產生了以下結果:
Hello World
變數是隻不過是保留記憶體位置來儲存值。這意味著,當建立一個變數,會在記憶體中保留一些空間。
基於變數的資料型別,所述編譯器分配儲存器,並決定什麼可以被儲存在保留儲存器。因此,通過分配不同的資料型別的變數,可以儲存整數,小數,或字元在這些變數。
變數宣告
Scala的變數宣告有不同的語法,它們可以被定義為值,即,常量或變數。下面是使用var關鍵字來定義一個變數的語法:
var myVar : String = "Foo"
在這裡,myVar使用關鍵字var宣告。這意味著它是一個可以改變值的變數,被稱為可變變數。下面是使用val關鍵字來定義變數的語法:
val myVal : String = "Foo"
這裡,myVal是使用關鍵字val宣告。這意味著,它是不能改變的變數,這是所謂的不可變變數。
變數資料型別:
變數型別在變數名後面指定,前在equals之前簽署。可以通過它的資料型別定義任何型別的Scala變數如下:
val or val VariableName : DataType [= Initial Value]
如果不指定任何初始值變數,那麼如下所示它是有效的:
var myVar :Int;
val myVal :String;
變數型別推斷:
當分配一個初始值給一個變數,Scala編譯器可以計算出根據分配給它的值的變數型別。這就是所謂的變數型別推斷。因此,可以寫這些變數的宣告如下這樣:
var myVar = 10;
val myVal = "Hello, Scala!";
在這裡,預設情況下,myVar是int型別,將設為myVal為字串型別變數。
多重任務:
Scala支援多工。如果一個程式碼塊或方法返回一個元組,該元組可被分配給一個val變數。 [注:元組在以後的章節中學習。]
val (myVar1: Int, myVar2: String) = Pair(40, "Foo")
型別推斷得到正確型別:
val (myVar1, myVar2) = Pair(40, "Foo")
變數型別:
Scala變數可以有三種不同的範圍,這取決於它們正在使用的地方。它們可以存在於欄位,方法引數和區域性變數。下面是關於每種型別的適用範圍的詳細資訊:
欄位:
欄位是屬於一個物件的變數。該欄位是從物件中的所有方法中訪問。欄位也可以是具體取決於訪問修飾符欄位與宣告的物件外訪問。物件欄位既可以是可變的或不可變的型別,可以使用var 或 val兩種定義。
方法引數:
方法的引數是變數,其用於傳遞方法內的值在方法被呼叫時。方法引數被從方法唯一傳入,但傳遞的物件可從外面,如果從外面的方法有一個引用物件。方法引數始終是可變的並由val關鍵字定義。
區域性變數:
區域性變數是在方法內宣告的變數。區域性變數只能在方法中訪問,但可以訪問建立方法的物件(如果從方法中返回它們)。區域性變數既可以是可變的或不可變的型別,可以使用var或val兩個關鍵字定義。
from: http://www.yiibai.com/scala/scala_basic_syntax.html