scala函式與方法
阿新 • • 發佈:2019-02-19
函式與方法的區別
方法:作用於物件,是物件的行為
def 方法名稱(引數列表):返回值 = 方法體
函式:是一個物件,實現了FunctionN特質的物件
val 函式名稱 =(引數列表) =>{ 函式體 }
定義
//def方法
def fac(x:Int) = if(x>=0) x else ""
//fac: fac[](val x: Int) => Any
//val函式
val fac = (x: Int) => if (x >= 0) x else ""
//fac: Int => Any = <function1>
如果函式體只有一條語句可以省略大括號:
val fac=(x:Int) => if(x>=0) x else ""
//fac: Int => Any = <function1>
上面的返回值型別都是隱式的(沒有使用return前提下),根據最後一個值推匯出其返回值型別(隱式轉換),可見函式和方法的返回型別可以是多型別的
顯式型別(def)
如果使用return,則只能是方法,必須顯式宣告返回型別,即方法的返回型別只能是一個型別
def fac(x:Int):Int = if(x>=0) return x else return -x
遞迴:
def fac(n: Int): Int = if (n <= 0) 1 else n * fac(n - 1)
//fac: fac[](val n: Int) => Int
預設引數(def)
def combine(content:String, left: String = "[", right: String = "]") = left + content +right
combine("scala") //res0: String = [scala]
combine("scala","{") //res1: String = {scala]
combine("scala" ,"{","}") //res2: String = {scala}
程式碼引數(def)
def combine(content:String, left: String = "[", right: String = "]") = left + content +right
combine("scala", right="}") //res3: String = [scala}
可變引數
def sum(args : Int*):Int = {
if(args.length == 0 )
0
else
args.head + sum(args.tail: _*)
}
sum(1) //1
sum(1,2) //3
過程
scala對不返回值的方法有特殊的表示法。如果方法體包含在花括號中但沒有前面的=號,那麼返回型別是Unit。這樣的方法叫做過程
def draw(s: String) {
println("-------")
println("|" + " " + "|")
println("|" + s + "|")
println("|" + " " + "|")
println("-------")
}
println(draw("123"))
/*
-------
| |
|123|
| |
-------
()
*/
偏函式
當函式有多個引數,而在使用該函式時不想提供所有引數,此時得到的函式便是偏函式
def sum(a: Int, b: Int, c: Int) = a + b + c
val fp = sum(1, _: Int, 3) //fp即是偏函式
println(fp(2))
println(fp(10))