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