首页 > 解决方案 > 使用 Ramda 存储临时值的模式

问题描述

模式

我一直发现自己这样做,我不确定它是否很好,或者我是否以错误的方式处理事情。

考虑以下:

const unfoldLast = curry(
  (pred, fn, init) => pipe(
    unfold(n => 
      (next => pred(n, next) && [n, next])(fn(n))
    ),
    last
  )(init)
);

具体来说,

n => (next => pred(n, next) && [n, next])(fn(n))

我读得不好。它是一个匿名函数,使用它的闭包并立即被调用。

我宁愿它看起来像这样:

n => pred(n, fn(n)) && [n, fn(n)]

这行为完全相同,只是它运行 fn(n) 两次。

问题

我发现自己经常使用这种立即调用匿名函数的模式来获取store临时值。我不确定如何以易于阅读的方式做类似的事情。

标签: javascriptramda.js

解决方案


我不确定有什么好办法解决这个问题。call我发现我根据我当前的需要在你正在做什么和使用之间切换。

n => (next => pred(n, next) && [n, next])(fn(n))

可以改写为

n => call (
  (next) => pred (n, next) && [n, next],
  fn (n)
)

或等价于

n => call (
  (next = fn (n)) => pred (n, next) && [n, next]
)

有时当我不使用 Ramda 1时,而不是定义callas (fn, ...args) => fn (...args),我会使用这个版本:(fn) => {with: (...args) => fn (...args)}然后我可以使用 as call (myFunction) .with ('some' , 'args')。但这仅在使用命名函数时才有用。

我是纯表达式编码的忠实粉丝,在我的函数定义中不使用任何语句,只使用表达式。这就是导致这个问题的原因。如果你不介意包括一些陈述,这也可以写成

n => {
  const next = fn(n)
  return pred (n, next) && [n, next]
}

1免责声明:我是 Ramda 作者。


推荐阅读