1. 程式人生 > >scala函式與方法

scala函式與方法

函式與方法的區別

方法:作用於物件,是物件的行為
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))