以以下示例为例:
getAnimalList = (hasCat) => { const baseAnimals = { dog: animLib.dog(), bear: animLib.bear()}; if(hasCat){ baseAnimals.cat = animLib.cat(); } return baseAnimals }
我试图用Ramda以函数式风格编写这段代码,但唯一的方法是让函数超出范围:
getAnimalList = (hasCat) => { const baseAnimals = { dog: animLib.dog(), bear: animLib.bear()}; return when(always(hasCat), merge({hasCat: animLib.cat()}))(baseAnimals) }
撇开如何 animLib 不在范围内,我要解决的方法是 hasCat 从外面传过来( 如果这是个问题的话 )如下所示:
animLib
hasCat
getAnimalList = (hasCat) => { const baseAnimals = { dog: animLib.dog(), bear: animLib.bear()}; const mergeCat = when(compose(equals(true), prop('hasCat')), compose(merge({hasCat: animLib.cat()}), prop('baseAnimals'))); return mergeCat({hasCat: hasCat, baseAnimals: baseAnimals}); }
但这使得代码极其冗长。有更好的方法吗?还是说冗长只是为了保持代码更纯净的代价。
在我看来,这很好:
getAnimalList = (animLib, hasCat) => { const baseAnimals = { dog: animLib.dog(), bear: animLib.bear()}; return hasCat ? merge({hasCat: animLib.cat()}, baseAnimals) : baseAnimals; }
when 和 ifElse 基于谓词函数而不是布尔值,在这里使用它们似乎有些过分。
when
ifElse
显然,如果你想要一个 animLib 在scope中,您可以使用类似Ramda的函数来实现这个函数 curry 或者只是换成
curry
getAnimalList = (animLib) => (hasCat) => { /* ... */ }
然后你可以创建 newAnimalList = getAnimalList(myAnimLib) .
newAnimalList = getAnimalList(myAnimLib)