1. 程式人生 > 其它 >Scala入門2之【方法與函式】

Scala入門2之【方法與函式】

技術標籤:Scalascala

Scala 方法與函式

引言

  • Scala 有方法與函式,二者在語義上的區別很小。Scala 方法是類的一部分,而函式是一個物件可以賦值給一個變數。換句話來說在類中定義的函式即是方法。

  • Scala 中的方法跟 Java 的類似,方法是組成類的一部分。

  • Scala 中的函式則是一個完整的物件,Scala 中的函式其實就是繼承了 Trait 的類的物件。

  • Scala 中使用 val 語句可以定義函式,def 語句定義方法。

1、方法

1.1 語法

def 函式名(引數名:引數型別):返回值型別={
	// 括號內的叫做方法體

	// 方法體內的最後一行為返回值,不需要使用return
}
  • 引數列表的引數型別不能省略
  • 返回值型別可以省略,由scala編譯器自動推斷
  • 定義遞迴方法,不能省略返回值型別
  • 返回值可以不寫return,預設就是{}塊表示式的值

示例

  • 定義一個方法,實現兩個整形數值相加,返回相加後的結果
  • 呼叫該方法
scala> def add(x:Int,y:Int):Int={x+y}
add: (x: Int, y: Int)Int

scala> add(3,5)
res0: Int = 8

  • 省略返回值型別,照樣可以
scala> def add(x:Int,y:Int)={x+y}
add: (x: Int, y: Int)Int

scala> add(3,5)
res2: Int = 8

  • 定義遞迴方法,不能省略返回值型別

  • 定義求階乘的方法

scala> def res(x:Int)={
     | if (x<=1) 1
     | else res(x-1)*x
     | }
<console>:13: error: recursive method res needs result type
       else res(x-1)*x
            ^
  • 正確程式碼
scala> def res(x:Int):Int={
     | if (x<=1) 1
     | else res(x-1)*x
     | }
res: (x: Int)Int

scala> res(3)
res1: Int = 6

1.2 方法引數

\quad \quad Scala中的方法引數,支援以下幾種型別的引數:

  • 預設引數
  • 帶名引數
  • 可變引數

預設引數

\quad \quad Scala 可以為方法引數指定預設引數值,使用了預設引數,你在呼叫函式的過程中可以不需要傳遞引數,這時函式就會呼叫它的預設引數值,如果傳遞了引數,則傳遞值會取代預設值。例項如下:

scala> def add(x:Int=0,y:Int=3)=x+y
add: (x: Int, y: Int)Int

scala> add()
res3: Int = 3

scala> add(1,4)
res4: Int = 5

帶名引數

\quad \quad Scala在呼叫方法的時候,可以指定引數的名稱來呼叫方法,示例如下:

scala> def add(x:Int=0,y:Int=3)=x+y
add: (x: Int, y: Int)Int

scala> add(x=2)
res5: Int = 5

可變引數

\quad \quad Scala 允許你指明函式的最後一個引數可以是重複的,即我們不需要指定函式引數的個數,可以向函式傳入可變長度引數列表。Scala 通過在引數的型別之後放一個星號來設定可變引數(可重複的引數)。如果方法的引數是不固定的,可以定義一個方法的引數是可變引數。

語法:

def 函式名(引數名:引數型別*):返回值型別={
	// 括號內的叫做方法體

	// 方法體內的最後一行為返回值,不需要使用return
}

示例如下:

  • 定義一個計算若干個值相加的方法
  • 並嘗試用這個方法
scala> def sum2(numbers:Int*) = {
     | var result = 0
     | for(number<- numbers){
     | result+=number
     | }
     | result
     | }
sum2: (numbers: Int*)Int

scala> sum2(1,2)
res7: Int = 3

scala> sum2(1,2,3)
res8: Int = 6

1.3 方法呼叫

\quad \quad 在scala中,有以下幾種方法呼叫方式,

  • 字尾呼叫法
  • 中綴呼叫法
  • 花括號呼叫法
  • 無括號呼叫法

1、字尾呼叫法

\quad \quad 這種方法與java沒有區別
語法

物件名.方法名(引數)

例子:

scala> math.abs(-1)
res7: Int = 1

2、中綴呼叫法

語法:

物件名 方法名 引數

例子:

scala> math abs -1
res8: Int = 1

3、花括號呼叫法

  • 方法只有一個引數,才能使用花括號呼叫法

語法:

物件名.方法名{引數}

例子:

scala> math.abs{-1}
res9: Int = 1

scala> math.abs{-1,-4}
<console>:1: error: ';' expected but ',' found.
math.abs{-1,-4}

4、無括號呼叫法

  • 如果方法沒有引數,可以省略方法名後面的括號

例子:

scala> def m3()=println("hello")
m3: ()Unit

scala> m3
hello

2、函式

定義函式

語法

val 函式名=(引數名:引數型別,引數名:引數型別......=> 函式表示式
  • 函式是一個物件(變數)
  • 類似於方法,函式也有輸入函式和返回值
  • 函式定義用val定義
  • 無需指定返回值型別

示例

scala> val f2=(x:Int,y:Int) => x-y
f2: (Int, Int) => Int = <function2>

scala> f2(4,1)
res11: Int = 3

3、方法與函式的區別與聯絡

3.1 區別

  • 方法是隸屬於類或者物件的,在執行時,它是載入到JVM的方法區中

  • 可以將函式物件賦值給一個變數,在執行時,它是載入到JVM的堆記憶體中

  • 函式是一個物件,繼承自FunctionN,函式物件有apply,curried,toString,tupled這些方 法。方法則沒有。

  • 方法無法賦值給變數

scala> def add(x:Int=0,y:Int=3)=x+y
add: (x: Int, y: Int)Int

scala> val a=add
<console>:12: error: missing argument list for method add
Unapplied methods are only converted to functions when a function type is expected.
You can make this conversion explicit by writing `add _` or `add(_,_)` instead of `add`.
       val a=add
             ^
  • 函式可作為一個引數傳入到方法中,而方法不行。

在這裡插入圖片描述

3.2 方法轉換為函式

  • 有時候需要將方法轉換為函式,作為變數傳遞,就需要將方法轉換為函式
  • 使用_ 即可將方法轉換為函式

例子:

scala> def add(x:Int=0,y:Int=3)=x+y
add: (x: Int, y: Int)Int
scala> val a=add _
a: (Int, Int) => Int = <function2>