代码之家  ›  专栏  ›  技术社区  ›  Sepehr Sobhani

函数Ramda在范围外传递函数参数

  •  0
  • Sepehr Sobhani  · 技术社区  · 7 年前

    以以下示例为例:

    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});
    }
    

    但这使得代码极其冗长。有更好的方法吗?还是说冗长只是为了保持代码更纯净的代价。

    1 回复  |  直到 7 年前
        1
  •  1
  •   Scott Sauyet    7 年前

    在我看来,这很好:

    getAnimalList = (animLib, hasCat) => {
      const baseAnimals = { dog: animLib.dog(), bear: animLib.bear()};
      return hasCat ? merge({hasCat: animLib.cat()}, baseAnimals) : baseAnimals;
    }
    

    when ifElse 基于谓词函数而不是布尔值,在这里使用它们似乎有些过分。

    显然,如果你想要一个 animLib 在scope中,您可以使用类似Ramda的函数来实现这个函数 curry 或者只是换成

    getAnimalList = (animLib) => (hasCat) => { /* ... */ }
    

    然后你可以创建 newAnimalList = getAnimalList(myAnimLib) .