程式扎記: [Scala 小學堂] Scala Gossic : 起步走 - 內建控制結構 (for 運算式)

標籤

2016年4月14日 星期四

[Scala 小學堂] Scala Gossic : 起步走 - 內建控制結構 (for 運算式)

轉載自 這裡 
前言 : 
Scala 是一個可直譯、編譯、靜態、運行於 JVM 之上、可與 Java 互操作、融合物件導向編程特性與函式編程風格的程式語言. 從一些簡單的語法開始,了解 Scala 的許多特性,所以就算是起步走,東西也夠多了. 簡單的小程式可以使用 scala 指令,編譯的事就交給 scalac,編譯想快點就用 fsc. (Scala 官網), 運算式有傳回值,迴圈沒有,對了!Scala 沒有 break 與 continue. 

for 運算式 : 
如果你想要循序取出某個序列,例如陣列,則可以使用 for 運算式,例如,將使用者提供的命令列引數逐一取出 : 
- For1.scala 代碼 :
  1. for(arg <- args="" nbsp="" span="">
  2.         println(arg)  
  3. }  

一個執行的範例如下 : 
# scala For1.scala This is for test
This
is
for
test

args 是個字串陣列,for括號中的「arg<-args font="">」是一個產生器(Generator)語法,它會迭代整個陣列,每一次取出陣列中一個元素並設定給 arg要注意的是,雖然沒有明確寫出,不過 arg 事實上是 val 所宣告的變數,你不可以在 for 運算式本體中改變 arg 的參考。雖然沒有必要,不過你要寫明 arg 是個 val 也是可以的. 在 for 運算式中也可以有 for 運算式,例如以下是個九九乘法表的顯示範例 : 
- For2.scala 代碼 :
  1. for(j <- nbsp="" span="">1 to 9) {  
  2.         for(i <- nbsp="" span="">2 to 9) {  
  3.                 printf("%d*%d=%2d ", i, j, i*j);  
  4.         }  
  5.         println()  
  6. }  

範例的運作原理是,1 to 9 這會產生一個 Range 物件(to 是 RichInt 上的方法),內含元素 1 到 9,for 運算式中的產生器語法逐一將元素 1 到 9 指定給變數。如果你要產生一個不包括 9 的 Range 物件,則可以使用 until 方法。例如 : 
  1. for(i <- nbsp="" span="">1 until 9) {  
  2.     println(i) // 顯示 1 到 8  
  3. }  
until 也可以讓你指定步進值,可指定正數或負數,例如若要指定步進值 2 : 
  1. for(i <- nbsp="" span="">1 until (92)) {  
  2.     println(i) // 顯示 1 3 5 7  
  3. }  
可以在 for 運算式的括號中撰寫兩個以上的產生器語法,中間以 分號 作區隔。例如如果巢狀 for 運算是連續的 : 
  1. for(i <- nbsp="" span="">1 to 9) {  
  2.     for(j <- nbsp="" span="">1 to 9) {  
  3.          // 作一些事...  
  4.     }  
  5. }  
則你可以撰寫為 : 
  1. for(i <- nbsp="" span="">1 to 9; j <- nbsp="" span="">1 to 9) {  
  2.     // 作一些事...  
  3. }  
在for 運算式中,可以撰寫 if 運算式,也就是 for 的過濾器(filter寫法,例如,若你想濾出命令列引數所提供的檔名中,副名為 .txt 結尾的部份,則可以如下撰寫 : 
  1. for(  
  2.     arg <- args="" nbsp="" span="">
  3.     if arg.endsWith(".txt")  
  4. ) println(arg)  
如果有兩個以上的過濾器 ,則必須以分號區隔,例如同時過濾副檔名為 .txt,而主檔名以 a 開頭的引數 : 
- For3.scala 代碼 :
  1. for(arg <- args="" nbsp="" span="">
  2.         if arg.endsWith(".txt");  
  3.         if arg.startsWith("a")) {  
  4.         println("Target > " + arg)  
  5. }  

執行結果 : 
# scala For3.scala abc.txt test.txt apple.txt alien.doc
Target > abc.txt
Target > apple.txt

在 for 中可以指定 中介變數(Mid-stream variable,例如 : 
- For4.scala 代碼 :
  1. for(  
  2.         arg <- args="" nbsp="" span="">
  3.         if arg.endsWith(".txt");  
  4.         file = arg  
  5.         if file.startsWith("a")  
  6. )println(file)  

執行結果 : 
# scala For4.scala abc.txt apple.txt alien.doc bibble.txt
abc.txt
apple.txt

雖然沒有在語法上指明,不過 file 實際上是個 val 所宣告的變數,所以你不可以再重新指定值給 file 變數. for 是個運算式,這代表著它可以有運算結果,運算結果會是個群集(Collection)物件,你可以在 for 運算式中使用 yield 來進行值的收集,for 運算結束傳回收集的結果,例如 : 
- For5.scala 代碼 :
  1. val files = for(arg <- args="" nbsp="" span="">if arg.endsWith(".txt")) yield arg  
  2. for(f <- files="" nbsp="" span="">
  3.         printf("Target > %s%n", f)  

執行結果 : 
# scala For5.scala abc.txt apple.txt alien.doc
Target > abc.txt
Target > apple.txt

補充說明 : 
Tutorialspoint - Scala For Loops 
起步走 - 內建控制結構 (if 運算式) 
起步走 - 內建控制結構 (for 運算式) 
起步走 - 內建控制結構 (while 迴圈) 
起步走 - 內建控制結構 (match 運算式) 

起步走 - 內建控制結構 (try 運算式)

沒有留言:

張貼留言

網誌存檔

關於我自己

我的相片
Where there is a will, there is a way!