十二步學會Scala(2):Scala的循環和數組
AlanWu在上一篇《十二步學會Scala(1)》中介紹了Scala的變量定義和方法定義,這一篇將進行第五到第八步,介紹循環和數組。
原文地址:AlanWu的博客 | 51CTO編輯推薦:Scala編程語言專題
第五步:運行腳本
Scala是一個動態性很強的語言,所以它也像Ruby那樣,能夠寫腳本運行。
新建一個hello.scala的文本文件:
- println("Hello, world, from a script!")
打開命令行,并到達hello.scala所在的目錄:
- D:\>scala hello.scala
- Hello, world, from a script!
- D:\>
可以看到很簡單,就運行了這個腳本。
第六步: 循環用while, 判斷用if
Scala中使用while和java差不多。
寫個把輸入的參數字符逐個打印出來的小腳本,printargs.scala
- var i = 0
- while (i < args.length) {
- println(args(i))
- i += 1
- }
這段腳本會把傳入的參數逐個打印出來。
while循環體外定義一個可變的變量i,在循環體內每次加一,直到傳入的參數全部打印完畢。
cmd
- D:\>scala printargs.scala Scala is fun
- Scala
- is
- fun
- D:\>
注意,Scala中不能用i++或++i
if在***篇的max方法中演示過了,不再重復。
第七步:用foreach和for進行迭代
上面介紹了用while做循環,用過ruby或者喜歡java5新特性的人可能會說,hey,做個循環怎么這么丑?
ruby,java5有foreach,Scala當然也有!
接著上面的需求,用foreach實現把傳入的參數打印出來。
建個文本文件,叫pa.scala,里面寫上
- args.foreach(arg => println(arg))
運行pa.scala你會看到
cmd
- D:\>scala pa.scala Scala is easy
- Scala
- is
- easy
- D:\>
arg是迭代變量,不需要手工賦值,編譯器會把傳遞給它。同時編譯器會認出arg的類型,所以這里不需要定義類型。
但我覺得如果類型不是一目了然的情況下,***是定義一下類型,可以使閱讀代碼的人很輕松。
把arg定義上類型
pa.scala
- args.foreach((arg: String) => println(arg))
注意當給變量定義類型的時候,必須要加括號!
這里傳給foreach的實際上就是一個匿名方法!
匿名方法的定義是這樣的:
方法參數 => 方法體
我們這個傳入的匿名方法就是: (arg: String) => println(arg)
很懶的程序員會發現,這里arg好像沒什么必要,唯一參數傳給唯一的方法體。在java這樣的想法可能是空幻想,但Scala幫你實現了!
我們可以省略成:
pa.scala
- args.foreach(println)
就這么少!
Scala還有一個for迭代,可以做更多的事情,但這里只介紹一下它的簡單用法。
在ruby中實現上面的打印參數:
- for arg in ARGV # Remember, this is Ruby, not Scala
- puts arg
- end
用Scala的for來實現
- for (arg <- args)
- println(arg)
感覺怎么樣?這里左箭頭<-可以讀成in。
在Scala,如果一句話是一行,可以省略分號;如果多個語句放在一行,用分號隔開。
第八步: 數組
數組是定義數據類型很重要很基礎的容器。在Scala里如何使用數組呢?這次我們的參數由程序定義,并把他們打印出來。
建個文本文件,叫paramswithvalues.scala
- val greetStrings = new Array[String](3)
- greetStrings(0) = "Hello"
- greetStrings(1) = ", "
- greetStrings(2) = "world!\n"
- for (i <- 0 to 2)
- print(greetStrings(i))
這里出現了很多Scala的新式武器!
1. 定義數組類型
Scala代碼
- val greetStrings = new Array[String](3)
val已經介紹過了,表示greetStrings不能再被賦值。
這里Array[String]表示類型,可以讀成字符串的數組,它是一個類型,也就是類,所以可以用new去實例化。
括號3表示數組容量是3
2. 數組元素賦值
Scala代碼
- greetStrings(0) = "Hello"
雖然greetStrings是不可更改的,但數字元素可以。
Scala用小括號代替java的中括號,可能很多java工程師會說:呵,發明新輪子。
其實Scala是被冤枉的。
Scala里所以東西都是對象,數組也不例外。數組賦值其實也是一個方法完成的。
上面的代碼會被編譯器轉換成兩個參數的方法:
Scala代碼
- greetStrings.update(0, "Hello")
當然你也直接這樣寫上面的賦值:
Scala代碼
- greetStrings.update(0, "Hello")
- greetStrings.update(1, ", ")
- greetStrings.update(2, "world!\n")
3. 數組元素讀取
在for循環體里面有
Scala代碼
- print(greetStrings(i))
為什么Scala不用中括號呢?是因為Scala有一套通用規則,會把小括號轉換成apply。
所以編譯器會得到這樣的代碼:
Scala代碼
- print(greetStrings.apply(i))
很魔術?其實只要知道Scala的一些通用規則,很多符號就變得非常簡單易懂了。
如果不使用符號,我們的代碼同樣可以完成:
Scala代碼
- val greetStrings = new Array[String](3)
- greetStrings.update(0, "Hello")
- greetStrings.update(1, ", ")
- greetStrings.update(2, "world!\n")
- for (i <- 0.to(2))
- print(greetStrings.apply(i))
這里for循環用了0 to 2,很容易理解,就是從0到2,默認步進1.
當方法參數只有一個的時候,可以不寫括號和點,
所以***循環是這樣寫就夠了:
Scala代碼
- for (i <- 0 to 2)
to是0的一個方法,
Scala代碼
- for (i <- 0.to(2))
數組就基本介紹到這里。接下來一篇將介紹集合類。
【編輯推薦】