從表面上看,Scala中的if語句看起來很像Java中的If語句。執行時首先判斷表達式的值,如果爲true,則執行對應代碼塊。否則進行下一代碼塊判斷。如下:
if(2+2 == 5){
println("hello from 1984.")
}else if(2+2 ==3){
println("hello from Remedial wath class?")
}else{
println("hello from a non-Orwellian future.")
}
上述代碼與java中if語句沒有任何差異,會執行條件爲true的代碼塊。但是,在Scala中,if與幾乎所有其他語句都是具有返回值的表達式。即可以將一個if語句賦值一個變量。如:
val configFile = new java.io.File("somefile.txt")
val configFilePath = if(configFile.exists()){
configFile.getAbsolutePath()
}else{
configFile.createNewFile()
configFile.getAbsolutePath()
}
上述代碼實現的功能是:判斷文件是否存在,如果存在,則將文件的絕對路徑賦值給configFilePath,否則新建文件,並將新文件路徑賦值給configFilePath。
對於if語句的返回值,主要時是根據各個判斷子句可能返回的類型決定,即取各個可能返回值的最接近父類,也稱爲所有條件分支的最小上界類型。
class Person
class Student extends Person
class Worker extends Person
def getPerson(age:Int){
val p1 = if(age <= 25){
new Student()
}else{
new Worker()
}
}
在上述代碼中,如果輸入年齡小於25,則返回Student對象,如果大於25,則返回Worker對象。Scala會根據類型推導,判斷各個分支語句返回值,然後取其最小父類。本例中,if表達式返回值是Student和Worker的共有父類,即Person。