2015/07/17

[ScaVa->Scala] 看懂Scala API Document - Implicit Parameters

今天要來介紹一下隱含參數(Implicit Parameters)

在Scala API Document中,當你看到以下的(Implicit ...)宣告時,就是今天要講的東西了!

這裡提到的,是scala.concurrent.List裡的sortBy,這裡除了定義了要傳一個(A)=>B的function之外(看不懂的請看這篇),後面跟了一個(implicit ord: math.Ordering[b])這個東西,其實這就要帶一個Ordering[b]型態的參數,若你不帶的時候,Compiler會找尋在可存取的範圍內,找尋宣告為implicit的變數(或是不用帶參數的method),當然若你有指定,就會以你指定的優先。

這個隱含參數常用在一些需要order, formatter...等可讓你客製規則的method中,而通常也都有提供default處理方式的。例如scala中很好用的json library - json4s 裡,在使用他的parse時就要指定formatter,而常會看到 implicit val formats = DefaultFormats 這樣的宣告。(這個DefaultFormats是定義在org.json4s.裡)

我自己是在寫Backend Services的時候,常會定義個TraceId,方便debug用,但這個值又必需傳至許多的functions裡面,若每個function都多定義要傳入這個參數,寫起來覺得很冗長又難看,所以我就使用了implicit parameter。


這裡可以看到,在run()裡面其實使用起來是很簡潔的,因為在閱讀這個程式的邏輯時,TracerId並不是呼叫這個function的重點,甚至在methodB要呼叫methodC的時候,也是很簡潔的直接呼叫就可以,這樣的做法可以讓程式閱讀起來更舒服。

參考資料: 官方教學文件 implicit-parameters


張貼留言

My World