我正在尝试用 JavaScript 编写一个函数库。我也在使用 lodash
。
到目前为止,我抽象地得到了什么:
x = _.curry(function(property, data) {
return data.get(property);
});
有了这个,您可以执行 x(1)(2)
和 x(1, 2)
,一切都会按预期进行。
假设我想修改该函数,使其data
可以是一个数组:
x = _.curry(function(property, data) {
if (_.isArray(data)) {
return _.map(data, x(property));
} else {
return item.get(property);
}
});
现在效果很好。但我有 30 多个功能。必须有一种比手动为每个函数编写 if (_.isArray(data)... else...
更好的方法。也许是一个装饰器?
decorate = function(func) {
// return a curried func and handle the aforementioned _.isArray
}
x = decorate(function(property, data) {
if (_.isArray(data)) {
return _.map(data, x(property));
} else {
return item.get(property);
}
});
我完全不知道如何编写装饰函数:一个可以使用 arity 2 和 arity 3 函数进行装饰的函数。
最佳答案
首先,用映射数组参数的函数包装原始函数,然后柯里化(Currying)该包装版本。
var decorate = function(func) {
var mapIfArray = function(property, data) {
if (_.isArray(data)) {
return _.map(data, _.curry(func)(property));
} else {
return func(property, data);
}
}
return _.curry(mapIfArray);
}
你可以像这样使用它:
var undecorated = function(property, data) {
return data.get(property);
}
var decorated = decorate(undecorated);
假设所有未修饰的函数都是 arity 2,最后可能是数组。如果情况并非如此,您要么必须为不同的参数创建不同的装饰器,要么对参数对象执行某种巫术。
关于javascript - 如何构建一个适用于多参数柯里化(Currying)函数的最终参数的装饰器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27572276/