2014-09-11 1 views
3

Что является самым элегантным способом конвертировать метод в функцию curried, и есть ли поддержка для этого в libs, например Underscore/Lo-dash или Ramda?Использование методов as (curried) в JavaScript

Для фиксированного числа аргументов, что я делаю это прямо сейчас:

var fn2 = _.curry(function (m, a1, a2, obj) { 
    return obj[m].call(obj, a1, a2); 
}); 

, который позволяет коду, как:

var a2b = fn2('replace', 'a', 'b') 
a2b('abc') 
=> 'bbc' 

, а также:

var nl2_ = fn2('replace', '<br>') 
nl2_('\n', 'some<br>html') 
=> 'some\nhtml' 
+0

Я не уверен, в чем вопрос; lo-dash, очевидно, поддерживает «curry», что квалифицируется как «самый элегантный», не используя его так, как написано? –

+0

Карри выполняет только половину работы, он не превращает метод в функцию – estolua

+0

Что именно это означает, «не превращает метод в функцию»? –

ответ

4

Вы может легко расширить ваш подход для методов с произвольной ясностью:

function curryMethod(m, a) { 
    if (a !== ~~a) a = m.length; 
    return _.curry(function() { 
     return m.apply(arguments[a], Array.prototype.slice.call(arguments, 0, -1)); 
    }, a+1); 
} 

> var replace = curryMethod(String.prototype.replace) 
> replace("a", "b", "abc") 
"bbc" 
> var a2b = replace("a", "b") 
> a2b("abc") 
"bbc" 

Поскольку вы также спрашивали о Ramda, я только быстро просмотрел их API, но нашел R.invoker function, который, кажется, именно то, что вы ищете.

+1

Подробнее об объекте [arguments object] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/arguments) – mrucci

+0

отлично, 'R.invoker', должно быть, поскользнулся мои глаза из-за сходства с '_.invoke', который делает что-то совсем другое. – estolua

Смежные вопросы