寫程式免不了要使用判斷邏輯,若要實現 switch
根據不同條件執行不同 function,Ramda 提供了 cond()
。
Version
macOS Catalina 10.15.6
Ramda 0.27.0
Imperative
let data = 1
let f = x => {
let result = 0
switch(x) {
case 1:
result = 10
break
case 2:
result = 20
break
default:
result = 30
break
}
return result
}
f(1) // ?
f(2) // ?
f(3) // ?
若條件中彼此互斥,Imperative 會使用 switch case
。
cond()
import { cond, equals, always, T } from 'ramda'
let data = 1
let f = cond([
[equals(1), always(10)],
[equals(2), always(20)],
[T, always(30)]
])
f(1) // ?
f(2) // ?
f(3) // ?
Ramda 提供 cond()
取代 switch case
。
cond()
[[(*… → Boolean),(*… → *)]] → (*… → *)
根據條件回傳不同 function,相當於 Imperative 的switch case
[[(*… → Boolean),(*… → *)]]
:array of array,每個小 array 包含 predicate 與要執行 function
(*… → *)
:回傳所選擇 function
另外 T()
相當於 () => true
,由於 always true,相當於 switch case
的 default
。
Conclusion
ifElse()
、when()
與unless()
都只適合單一條件,若要多條件就要靠cond()
cond()
特色是每個 case 與其回傳值都在同一個 Array 內,第一個 element 是判斷條件,但因為是 function 所以可 point-free;第二個 element 是執行 function,儘管只回傳 value,也必須以always()
包成 function