scala除了方法外還支持函數,方法是對對象進行操作,而函數不是。(類型與java中靜態方法,媽蛋,好歹也寫過C和C++這還理解不深刻了)。除此之外,寫法一樣。 object add{ //指定返回值類型,返回的值不需要使用return指定,會取最後一個表達式的值。 def abs(x:Double ...
scala除了方法外還支持函數,方法是對對象進行操作,而函數不是。(類型與java中靜態方法,媽蛋,好歹也寫過C和C++這還理解不深刻了)。除此之外,寫法一樣。
object add{
//指定返回值類型,返回的值不需要使用return指定,會取最後一個表達式的值。
def abs(x:Double):Double = if(x>=0) x else -x
//函數體需要多個表達式完成,就用代碼塊咯,代碼塊特性看代碼塊知識點咯。算了,跟你提示一下,會取最後一個表達式的值。
def addInt( a:Int, b:Int ) : Int = {
var sum:Int = 0;
sum = a + b;
sum;
}
//也可以不指定返回值類型,scala編輯器可以通過=號右側的表達式類型推斷出返回類型。
def remoInt( a:Int, b:Int ) = {
var sum:Int = 0;
sum = a - b;
sum;
}
//這個就是簡化版,就是函數是無參,可以不寫()號,返回值類型不指定,scala推斷出來,表達式就一句,就不用代碼塊了。
def remoInt=22;// def remoInt() : Int = {22}
//遞歸函數,不指明返回類型會無法通過校驗,scala編譯器無法校驗n*fac(n-1)的類型時Int,我想不明白。
def fac(n:Int):Int = {
if(n<=0) 1 else n*fac(n-1)
}
// def fac(n:Int)= {
// if(n<=0) 1 else n*fac(n-1)
// }
//這裡返回值為(),因為你列印值,這樣相當於返回的unit類型,那不就是()值嗎。傻逼。
def foreacher(n:Int)= {
for(sum <- 0 to n)
{
println(sum);
}
}
def main(args: Array[String]) {
println(add.foreacher(3)+"---");
}
}
預設參數格式
def decorete(str:String,left:String="[",right:String="]")=left+str+right;
我們可以看到這個函數有兩個參數left和right帶有預設值"["和"]"。
object add{
def decorete(left:String="[",str:String,right:String="]")=left+str+right;
def demo(str:String,left:String="[",right:String="]")=left+str+right;
def main(args: Array[String]) {
// println(add.decorete("nihao"));//檢查不通過,原因就是參數nihao匹配的是left字元串,而str字元串沒有傳入值。
println(add.decorete("nihao","baby"));//nihaobaby]
println(add.demo("nihao"));//[nihao]
//原因就不需要解釋,看到這三個結果就明白了。
//提供參數的時候指定參數名。
println(add.decorete(str="baby"));//[baby] 沒指定的就預設值嘛,不要糾結,小韭菜們。
println(add.decorete(left="[]",str="baby"));//[]baby]
//混合也是可以的,不要糾結書本,就你去掉指定的參數,然後看你傳入沒指定參數的值和方法中沒有獲得傳入值且沒有預設值得參數位置匹配吧。匹配就通過,沒有就無法通過報錯。
println(add.decorete(left="[]","baby"));//[]baby] 這個我們很明顯baby是作為方法參數中去掉指明參數後的第一個參數名的值。
println(add.decorete(left="[]","baby","***"));//[]baby*** 這下明白了把,再不明白,你可以去工地搬磚了。
}
}
變長參數等我心情好了,就總結。