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

標籤

2016年4月13日 星期三

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

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

if 運算式 : 
要在某條件成立時才進行某些動作,Scala 提供了 if 運算式,一個例子如下 : 
- If1.scala 代碼 :
  1. var filename = "default.properties"  
  2. if(!args.isEmpty) {  
  3.     filename = args(0)  
  4. }   
  5. println("File name > "+filename)  

執行結果 : 
# scala If1.scala test.txt <有提供argu>
File name > test.txt

# scala If1.scala
File name > default.properties <使用預設值>

這 個範例中,預設的檔案名稱是 default.properties,如果使用者有提供命令列引數,則 args 不為空,isEmpty 會傳回 false,所 以 !args.isEmpty 的結果是 true,所以 if 條件成立,將 filename 設定為使用者所提供的命令列引數. 在 Scala 中,如果 if 中只有一個陳述句,則大括號可以不用撰寫. if 可以搭配 else,在 if 條件不成立時,執行 else 中定義的程式碼,所以上例也可以這麼寫 : 
- If2.scala 代碼 :
  1. var filename = ""  
  2. if(args.isEmpty) {  
  3.     filename = "default.properties"  
  4. else {  
  5.     filename = args(0)  
  6. }  
  7. println("File name > "+filename)  

在 Scala 中一個重要的特性就是,if..else 是個運算式expression,也就是說 if..else 會有傳回值,傳回值就是 if 或 else 中最後一個 語句。由於 Scala 鼓勵你使用 val 宣告變數,你可以利用 if...else 運算式會傳回值的特性,將上例改寫為以下 : 
- If3.scala 代碼 :
  1. val filename = if(args.isEmpty) "default.properties" else args(0)  
  2. println("File Name > "+filename)  

如果沒有提供命令列引數,則 args.isEmpty 為true,if條件成立,所以傳回 "default.properties" 的字串給 filename,否則傳回 args(0) 的值給filename. if..else 為運算式的特性,可以讓Scala撰寫簡潔的程式碼,例如以下是個簡單的判斷輸入數是奇數或偶數的程式 : 
- If4.scala 代碼 :
  1. print("Please input integer: ")  
  2. val input = readInt  
  3. printf("%d is %s", input, if(input%2==0"Even" else "Odd")  

if..else 運算式的傳回值,是區塊中的最後一個語句,如果 if..else 中丟出了例外會如何呢 ? 
- If5.scala 代碼 :
  1. val filename = if(!args.isEmpty) args(0else   
  2.         throw new RuntimeException("Must give argument!")  
  3. println(filename)  

執行結果 : 
# scala If5.scala test.txt
test.txt

scala If5.scala
java.lang.RuntimeException: Must give argument!
at Main$$anon$1.(If5.scala:2)
...

這個例子是可通過編譯並運行的,執行時其實是先運算 if..else,如果有提供命令列引數,則 filename 變數會被宣告並設定為 args(0),否則 else 中會丟出例外,所以就不會宣告 filename 變數了! if.. else 既然是運算式,就上例來說,條件成立是會傳回值,那丟出例外時是否有傳回值?丟出例外時,基本上是標示其傳回 Nothing,Nothing 是 Scala 型態架構中最底層的 型態,如此就可通過編譯器對 if..else 運算式的語法檢查。不過實際上並沒有 Nothing 的實例,傳回 Nothing 代表著程式異常終止,例外丟出就是跳離該行執行,所以 filename 變數的宣告就沒有執行. 

補充說明 : 
Tutorialspoint - IF/ELSE Statement
起步走 - 內建控制結構 (if 運算式) 
起步走 - 內建控制結構 (for 運算式) 
起步走 - 內建控制結構 (while 迴圈) 
起步走 - 內建控制結構 (match 運算式) 
起步走 - 內建控制結構 (try 運算式)

沒有留言:

張貼留言

網誌存檔

關於我自己

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