2016-01-02 4 views
3

Это довольно простой в Clojure -Карринг с переменным числом аргументов процедурный и получить еще один процедурный в список переменной длины рубина

(def a (partial println "Hello:")) 
(a "Bob") 
(a "Bob" "Ganesh") 

Но это кажется трудным в Ruby.

:puts.to_proc.curry(3)[Kernel, "Hello:"]("Bob") 
:puts.to_proc.curry(4)[Kernel, "Hello:"]("Bob", "Ganesh") 

ProC# curry, похоже, не в состоянии вернуть varargs fn.

Конечно, мы можем

class Proc 
    def partial(*left) 
    Proc.new do |*right| 
     self.call *left, *right 
    end 
    end 
end 

Но мне было интересно, если бы это было в стандартной библиотеке.

+0

Пожалуйста, сформулируйте вопрос, чтобы его могли понять знакомые с Ruby, но не Closure. Под «varargs fn» вы имеете в виду curried proc с переменным числом аргументов? Для вашего примера, что вы хотите, чтобы proc возвращался при вызове? –

+0

С неопределенным номером, да. Varargs - это нейтральный язык. –

ответ

0

Попробуйте вместо этого:

:puts.to_proc.curry(3)[Kernel, "Hello:"].("Bob") 

В рубина, голые круглые скобки работают только для вызова методов. Для вызова procs вам необходимо либо .call(), либо [] или .().

+0

Три способа? Пять способов! 'f = -> s {puts" Say # {s}! " }; f.yield («эй») # => «Скажи, эй!»; f === "hey" # => «Скажи, эй!». –

+0

На самом деле это не вопрос. –

+0

Возможно, я неправильно понял? Но это делает код из вашей оригинальной работы – Jonah