在ruby中将函数作为参数传递

Sha*_*ese 5 ruby closures functional-programming

我试图用ruby中的函数式编程来解决这个问题,似乎没有太多好的文档.

本质上,我正在尝试编写一个具有Haskell类型签名的组合函数:

[a] -> [a] -> (a -> a -> a) -> [a]
Run Code Online (Sandbox Code Playgroud)

所以

combine([1,2,3], [2,3,4], plus_func) => [3,5,7]
combine([1,2,3], [2,3,4], multiply_func) => [2,6,12]
Run Code Online (Sandbox Code Playgroud)

等等

我发现了一些关于使用zip和map的东西,但是使用它感觉真的很难看.

实现这样的东西最"红宝石"的方式是什么?

小智 10

好吧,你说你知道拉链和地图所以这可能没有帮助.但我会发布以防万一.

def combine a, b
    a.zip(b).map { |i| yield i[0], i[1] }
end

puts combine([1,2,3], [2,3,4]) { |i, j| i+j }
Run Code Online (Sandbox Code Playgroud)

不,我也不觉得它很漂亮.

编辑 -#ruby-lang @ irc.freenode.net建议:

def combine(a, b, &block)
    a.zip(b).map(&block)
end
Run Code Online (Sandbox Code Playgroud)

或者,如果你想转发args:

def combine(a, b, *args, &block)
    a.zip(b, *args).map(&block)
end
Run Code Online (Sandbox Code Playgroud)