//定義一個接收消息的函數 getMsg,它有一個參數 msg 用來接收消息的內容。它的函數體是一個匿名函數,匿名函數有一個參數 name 用來接收姓名。
scala> def getMsg (msg : String) = (name : String) => println(msg + " , " + name)
getMsg: (msg: String)String => Unit
//調用函數getMsg,說 hello
scala> val msg = getMsg("hello")
msg: String => Unit = <function1>
現在得到了一個返回值,它是一個匿名函數。
//調用這個匿名函數,跟 Mike 說 hello
scala> msg("Mike")
hello , Mike
//一步到位的跟 Luffy 說 hi
scala> getMsg("hi")("Luffy")
hi , Luffy
這個例子中的函數getMsg實現了一個簡單的發送消息的功能。但是我們可以發送不同的消息內容,而且可以向不同的人發送。這就極大的擴展了函數的功能。getMsg實際上就是scala中的高階函數,它返回一個匿名函數。
將函數的定義 getMsg: (msg: String)String => Unit 分解開來:
函數名稱 :getMsg,
參數列表 :變量msg 類型為String
返回值 : String => Unit 表示一個接收String類型參數,沒有返回值的匿名函數
==============================================華麗分割線==============================================================
換一種形式來實現這個功能。
//定義一個打招呼的函數 sayHello,傳入一個name,表示跟誰打招呼。
scala> def sayHello (name :String) = println("hello," + name)
sayHello: (name: String)Unit
//定義一個函數 greeting,它也是一個高階函數,但它與getMsg的定義不同。它接收兩個參數:一個是匿名函數,要求這個匿名函數是一個接收String類型參數,沒有返回值的函數。另外一個參數是String類型的變量。
scala> def greeting(func :(String => Unit),name :String) = {func(name)}
greeting: (func: String => Unit, name: String)Unit
//調用函數 ,跟 Mike 打個招呼吧。
scala> greeting(sayHello,"Mike")
hello,Mike
看似現在功能不如gegMsg強大吖。只能說hello,不能說別的了?
其實並不是。這個函數的功能可能更大強大,因為它可以接收任意的一個符合它參數定義的匿名函數作為參數。比如,我們可以定義一個說hi的函數
//定義另外一個打招呼的函數
scala> def sayHi(name :String) = println("hi," + name)
sayHi: (name: String)Unit
//調用這個函數跟 Mike 說 hi 吧
scala> greeting(sayHi,"Mike")
hi,Mike
也就是說,只要一個函數符合 String => Unit 這個定義,它就可以作為參數傳入到greeting中。