采用以下示例命令式JavaScript示例:
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
来自外部传递(如果这是一个问题)是以下内容:
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});
}
但是这使得代码非常冗长。有一个更好的方法吗?或者是冗长只是保持代码更纯粹的成本。
答案 0 :(得分:1)
在我看来,这样做会很好:
urllib2.URLError: <urlopen error no host given>
因为Ramda的getAnimalList = (animLib, hasCat) => {
const baseAnimals = { dog: animLib.dog(), bear: animLib.bear()};
return hasCat ? merge({hasCat: animLib.cat()}, baseAnimals) : baseAnimals;
}
和when
是基于谓词函数而不是布尔值,所以在这里使用它们似乎有些过分。
显然,如果您想要一个范围为ifElse
的版本,您可以使用Ramda的curry
或仅更改为
animLib
然后您可以创建getAnimalList = (animLib) => (hasCat) => { /* ... */ }
。