我刚刚用Ramda函数观察到这种行为,并且不太了解它。对于以下二进制函数
$scope.stopTime = $interval(updateTime, 1000);
$scope.on('$destroy', function() {
$interval.cancel($scope.stopTime);
});
当给出两个参数时,例如,
const t1 = (a) => R.cond([ [R.T, R.identity] ] );
按预期返回t1(1)({})
。
但是,如果这样调用
{}
它会返回t1(1)()
。
这里到底是怎么回事?第二个参数是默认为某个东西,还是被视为从未提供过?
Ramda是否有办法明确设置第二个参数的默认值(例如[Function: f1]
)?
答案 0 :(得分:3)
嗯,首先,我不了解你的功能。 R.cond([ [R.T, R.identity] ] )
是一种稍微奇怪的方式来编写基本上是身份函数的东西。 cond
通常需要多个谓词 - 操作对,通常使用谓词R.T
作为默认值(类似于default
语句的switch
情况。)< / p>
在(a) => R.cond([ [R.T, R.identity] ] )
中包含它只是给你一个函数,你传递任何你喜欢的参数,这些参数会被迅速忽略,并返回那个奇怪的身份函数。
与Ramda创建的许多函数一样,cond
的输出是 curried 函数,使用Ramda扩展的currying概念,您可以在其中调用各种函数方法。例如,如果g = curry(function f(a, b, c) {/* ... */})
,那么所有这些都等同于f(a, b, c)
:
g(a, b, c)
g(a, b)(c)
g(a)(b, c)
g(a)(b)(c)
如果你用少于完整的参数调用,你会得到另一个函数:
g(a); //~> curry((b, c) => f(a, b, c))
g(a, b); //~> curry((c) => f(a, b, c))
这甚至延伸到根本不提供任何参数:
g(); //~> curry((a, b, c) => f(a, b, c)),
这最后是你注意到的。 t1(1)
会返回奇怪的身份R.cond([ [R.T, R.identity] ] )
。因为这个函数是curry,如果你在没有参数的情况下调用它,你会得到与同一个标识函数相同的东西。
这应该解释为什么函数的行为与它一样。我不能说出你要解决的根本问题,所以我不知道如何帮助......
除非你提到违约,否则Ramda的defaultTo
可能会有所帮助。