基礎文法
關於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
空或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聲明。這意味著,它是不能改變的變數,這是所謂的不可變變數。 VARIANT 資料型別:
變數類型在變數名後面指定,前在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