2015/07/16

[ScaVa->Scala] 看懂Scala API Document - Function Parameter

2011年換工作時,順便把最熟悉的程式語言也換了,從ASP.Net, C#換成寫Scala…

一直以來有想要把程式從ScaVa(謔稱,表示用Java的方式在寫Scala)寫成比較有Scala語法精義的過程給記錄起來,但總是不知如何起筆…(有太多的前情提要需要解釋,所以好懶得動筆)。

今天就開始寫吧! 從我一開始接觸Scala遇到一件痛苦的事,看不懂官方的API Document...
這邊解釋一下,我從小就不是個按步就班乖乖做事的小孩,我買書從來不喜歡從前面開始慢慢看,學個新的程式當然不會去買書或是找個文章從頭開始乖乖看,我就喜歡直接看別人的code,直接寫,遇到不懂的再查,但是居然官方的API Document我遇到了不少挫折…

這邊就來解釋一些我遇到的一些問題:
寫程式總是會用到一些資料結構,Scala.collection裡面最常用到的其中之一的好東西就是List
而一開始總是會查一下List有哪些method好用(API Doc),翻了一下有filter耶!! 但這東西要怎麼用?!
這…是要傳什麼進去?
其實p是變數名稱,而後面的(A) => Boolean代表要傳入一個function,他的Input型態是A (也就是你這個List裡面東西的型態),而=>之後的Boolean表示這個function的回傳值要是Boolean。
舉個例子,我想filter這個List裡面的Int,只想留下奇數,而下面有三個做法

  1. 定義個變數叫oddFilter(當然你也可以用def直接定義好function指給filter用),而這個變數裡面是個符合我上面所描述的規則的function。
  2. 直接在filter裡面,寫function的實作,其實這是個anonymous function。
  3. 也是在filter裡面直接寫anonymous function,但是用{}括起來,適用function裡要比較多行的實作時使用。


再來看另個method aggregate看起來比較複雜的樣子…

第一次看到應該都會覺得…"啥洨…",但其實慢慢看就會了解其實不難的!

  • [B] 這個就一般泛型的宣告,很多語言都一樣,所以就是有B這個type
  • (z: => B) 這是個縮寫,其實應該是 (z: ()=>B),跟filter一樣,z只是個變數,而這個z的型態,是一個function,不用傳東西進去,而回傳值必需是B
  • (seqop: (B, A) => B, combop: (B, B) => B) 這個就只是要帶兩個function進去,一個是傳入B和A型態的參數並回傳B型態,另一個是傳入兩個B,然後回傳B型態的結果。

把function當成參數其實是個非常有彈性的做法,這讓程式架構的設計上讓你不只可以把許多邏輯抽離成function,還可以讓這些function組合使用,非常靈活的!
對這個有興趣可以多看一些實例 (可看Scala cookbook或是上GitHub看看神人們的作品)。


張貼留言

My World