set()
與 over()
都可使用 Lens 新增修改 Property,唯 set()
是傳入值,而 over()
是傳入 Function。
Version
Ramda 0.27.1
over()
import { ifElse, has, over, lensProp, inc, set } from 'ramda'
let incCount = ifElse(
has('count'),
over(lensProp('count'), inc),
set(lensProp('count'), 1)
)
incCount({}) // ?
incCount({ count: 1 }) // ?
若傳入 Object 有 count
property 則修改其值遞增,若無則建立 count
property 並設定初始值為 1
。
第 3 行
let incCount = ifElse(
has('count'),
over(lensProp('count'), inc),
set(lensProp('count'), 1)
)
使用 ifElse()
組合出 incCount()
:
has('count')
:判斷是否有count
propertyover(lensProp('count'), inc)
:若有則透過 Lens 修改 property,注意第二個 argument 是inc()
而非定值set(lensProp('count'), 1)
:若無則透過 Lens 新增 property,注意第二個 argument 是定值而非 function
over()
Lens s a → (a → a) → s → s
透過 function 使用 lens 新增修改 object 指定 property
Lens s a
:傳入 property 的 Lens(a -> a)
:傳入改變 property 的 functions
:傳入 Objects
:回傳新 Object
assoc()
import { ifElse, has, over, lensProp, inc, assoc } from 'ramda'
let incCount = ifElse(
has('count'),
over(lensProp('count'), inc),
assoc('count', 1)
)
incCount({}) // ?
incCount({ count: 1 }) // ?
第 3 行
let incCount = ifElse(
has('count'),
over(lensProp('count'), inc),
assoc('count', 1)
)
若改變 property 不要求 function,其實 set()
與 assoc()
功能相同。
Conclusion
set()
與assoc()
功能相同,唯set()
必須搭配 Lensset()
與over()
都能藉由 Lens 新增修改 property,唯set()
傳入定值,而over()
可傳入 function