Вы можете определить свой собственный, используя inject
:
def nest(f, x, n)
n.times.inject(x) { |m| f.call(m) }
end
Тогда вы могли бы назвать это так:
>> def f(x) 2*x end
>> nest(method(:f), 1, 3)
=> 8
Если вы хотите вернуть функцию (т.е. не указывать x
), вы можете вернуть лямбду:
def nestx(f, n)
->(x) { n.times.inject(x) { |m| f.call(m) } }
end
и используйте его так:
>> nestx(method(:f), 3).call(1)
=> 8
Или вы можете изменить nest
аргументы и использовать Proc#curry
:
def nest(f, n, x)
n.times.inject(x) { |m| f.call(m) }
end
>> method(:nest).to_proc.curry.call(method(:f), 3).call(1)
=> 8
Вы также можете использовать []
вместо call
, если хотите что-то, что больше похоже на вызов функции:
def nest(f, n, x)
n.times.inject(x) { |m| f[m] }
end
>> method(:nest).to_proc.curry[method(:f), 3][1]
=> 8