Ruby:一个函数返回另一个函数

Ren*_*ald 4 ruby function

为了理解ruby的函数编程部分,我想编写一个函数,该函数将2个函数f(x,y),g(x)作为参数并返回一个新函数h(x,y)= f(g(x ),g(y))。

def foo(x, y)
    return x+y
end

def bar(x)
    return 2*x
end

def comp(f,g)

end

f=comp(f,g)
f(1,2) #=> 6
Run Code Online (Sandbox Code Playgroud)

我尝试过类似的事情

def comp(f,g)
    mylambda = lambda {|x,y| return f(g(x),g(y))}
    return mylambda
end
f=comp(foo, bar)
f.call(1,2)
Run Code Online (Sandbox Code Playgroud)

我以为f现在是Proc,我可以称之为。但显然是“在foo中:错误的参数数量(0表示2)(ArgumentError)”

我必须使用什么语法?并且有可能返回一个“真实的”函数而不是Proc,以便代替f.call(1,2)我可以像我刚刚正常定义f一样缠绕f(1,2)吗?

Ren*_*non 6

这种功能模式无法像其他功能语言(如javascript或python)一样流畅。由于ruby具有可选的括号,因此编写foo与在foo不传递任何参数的情况下调用该方法相同。

要获得对方法的引用,您需要使用该Object#method方法:

def foo(x, y)
  x + y
end

def bar(x)
  x * 2
end

def comp(f, g)
  lambda { |x, y| f.call(g.call(x), g.call(y)) }
end

h = comp(method(:foo), method(:bar))
h.call(1, 2) # => 6
Run Code Online (Sandbox Code Playgroud)