javascript - 使用 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
临时值。我不确定如何以易于阅读的方式做类似的事情。
解决方案
我不确定有什么好办法解决这个问题。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时,而不是定义call
as (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 作者。
推荐阅读
- excel - VBA 代码错误:“内存不足”
- c++ - 作为副本传递的 std::move() 变量的影响是什么?
- sql - 如何用 Oracle SQL 函数或存储过程替换嵌套表
- android - 共享元素过渡未显示在顶部
- python - 根据灰度动态范围将图像分类为褪色或不褪色?
- scala - 如何在 Scala 中将 Seq[Object] 转换为 Map[User, Set[String]
- foreach - Kotlin Foreach 循环不更新宽度
- visual-studio-code - 如何在 VSCode 中使用 ftp-simple 下载远程文件
- batch-file - 带有配置文件(键值对)的批处理文件引发错误
- c++ - 使用双重 LL 在 C++ 中实现 Stack 失败,出现异常“EXC_BAD_ACCESS (code=2, address=0x7fff5df48ff8)”