學習環境我是這樣搭建的
首先選擇ubuntu linux 14.04
然後安裝docker 安裝docker教程點這裡
安裝好後docker後,下載scala環境鏡像
sudo docker pull index.alauda.cn/ttch/scala
下載好後,然後執行如下命令
sudo docker run --rm \ -v 本地目錄:/scala \ -it index.alauda.cn/ttch/scala bash
可以看到進入了一個bash console下。然後嘗試執行scala。這樣就進入了控制臺程序中。
scala文法結構參考如下地址點擊
閱讀了不少scala的書籍和文章,幾乎沒有一個系統結構性講解scala的。所以這也是寫本系列文章的目的
下面簡單按照幾個結構進行整理和學習:
爭取能梳理一個系統的文章路徑,提供快速學習scala(本身scala這個語言的學習曲線也十分陡峭)
下面我們從文法角度去逐個使用例子看scala的使用方式和方法。
abstract case catch class defdo else extends false finalfinally for forSome if implicitimport lazy macro match newnull object override package privateprotected return sealed super thisthrow trait try true typeval var while with yield_ : = => <- <: <% >: # @
以上是的關鍵詞組成
那麼下面先通過scala的交互命令行來進行基本的實驗和講解。
首先先來實驗基本的定義聲明,那麼看看她的文法是什麼樣的?
Dcl ::= 『val』 ValDcl | 『var』 VarDcl | 『def』 FunDcl | 『type』 {nl} TypeDcl
定義聲明分成4部分。
那麼首先看下完成val定義文法
方法1:
plainid ::= upper idrest | varid | opid ::= plainid | 『`』 stringLiteral 『`』ValDcl ::= ids 『:』 Typeids ::= id {『,』 id}
方法2:
PatVarDef ::= 『val』 PatDef | 『var』 VarDefPatDef ::= Pattern2 {『,』 Pattern2} [『:』 Type] 『=』 ExprPattern2 ::= varid [『@』 Pattern3] | Pattern3Pattern3 ::= SimplePattern | SimplePattern { id [nl] SimplePattern }SimplePattern ::= 『_』 | varid | Literal | StableId | StableId 『(』 [Patterns 『)』 | StableId 『(』 [Patterns 『,』] [varid 『@』] 『_』 『*』 『)』 | 『(』 [Patterns] 『)』 | XmlPattern
兩種定義常量的方法可以看出,一個是需要提供類型
val valname : type = ...
另一種是直接定義常量,通過推導的方式得到常量的類型和初始化值。
val valname = ...
假設()為可以存在或者不存在,按照語言的結構可以按照這樣的理解
val valname (: type) = 推導公式
下面列舉一些patVarDef中 val的定義方式有以下幾種:
1.1
val (abc, bcd) = ("123","123")
結果為:
abc: String = 123bcd: String = 123
1.2
val abc = (2,3)
結果為:
x: (Int, Int) = (2,3)
1.3
val array@Array(_,test) = Array("hello","hello")
結果為
array: Array[String] = Array(hello, hello)test: String = hello
那麼在上面的文法中可以看到可以跟指定 Type
val array@Array(test1:Any,test:String) = Array("hello","hello")
結果為:
array: Array[String] = Array(hello, hello)test1: Any = hellotest: String = hello
1.4
val array@_,array2@_ =( Array("hello","hello"),Array("test","test"))
上面是一個多常量初始化賦值的文法,結果如下:
array: (Array[String], Array[String]) = (Array(hello, hello),Array(test, test))array2: (Array[String], Array[String]) = (Array(hello, hello),Array(test, test))
那麼左邊加上括號是有上面區別呢?
val (array@_,array2@_) =( Array("hello","hello"),Array("test","test"))
結果如下:
array: Array[String] = Array(hello, hello)array2: Array[String] = Array(test, test)
如果需要了解更多可以點擊官方參考, 那麼上面文法多次提到了StableId,stableId的文法是有如下構成的。
StableId ::= id | Path 『.』 id id ::= plainid | 『`』 stringLiteral 『`』 plainid ::= upper idrest | varid | opvarid ::= lower idrestupper ::= 『A』 | … | 『Z』 | 『$』 | 『_』 // and Unicode category Lulower ::= 『a』 | … | 『z』 // and Unicode category Llidrest ::= {letter | digit} [『_』 op]
那麼根據官方參考來看看如下模式如何使用
如下有3種模式:
SimplePattern ::= StableId | StableId 『(』 [Patterns 『)』 | StableId 『(』 [Patterns 『,』] [varid 『@』] 『_』 『*』 『)』
根據上面文法樹分支可以得到4種模式
下面一個個分析其中模式和代碼方式,這裡只從val和var的角度去看待,其他模式下的使用方式暫時不作實驗記錄。
假設有這樣一個需求,需要聲明一個常量a,常量A初始化為C,現在需要確定C變量是否和B變量值匹配,如果不一樣則報錯。
那麼可以這樣寫 val B , C = "hello"
結果如下:
B: String = helloC: String = hello
賦值代碼如下:
val a@B = C
結果如下:
a: String = hello
例子1
val a@("hello",1) = ("hello",1)
結果如下 :
a: (String, Int) = (hello,1)
例子2
val a@("hello","string") = ("hello",1)
結果如下:
<console>:8: error: type mismatch;found : String("string")required: Int val a@("hello","string") = ("hello",1) ^
從上面可以看出,構建常量的匹配初始化校驗方式。
官方例子:
val x = (1, 2)val y = x match { case Pair(i, s) => Pair(s + i, i * i)}
val a@Seq('h','e','l',test @ _*) = Seq('h','e','l','l','o')a: Seq[Char] = List(h, e, l, l, o)test: Seq[Char] = List(l, o)