在Ruby中使用高阶函数

时间:2012-12-18 19:57:22

标签: python ruby function

我在学习Python之后尝试学习Ruby,而我在将此代码转换为Ruby时遇到了麻烦:

def compose1(f, g):
    """Return a function h, such that h(x) = f(g(x))."""
    def h(x):
        return f(g(x))
return h

我是否必须使用块翻译?或者Ruby中有类似的语法吗?

3 个答案:

答案 0 :(得分:8)

你可以在Ruby中使用lambdas(我在这里使用1.9 stabby-lambda):

compose = ->(f,g) { 
  ->(x){ f.(g.(x)) }  
}

所以compose是一个返回另一个函数的函数,如例子所示:

f = ->(x) { x + 1 }
g = ->(x) { x * 3 }

h = compose.(f,g)
h.(5) #=> 16

请注意,函数式编程并不是Ruby的强项 - 它可以完成,但在我看来它看起来有些混乱。

答案 1 :(得分:3)

让我们说fg是以下方法:

def f(x)
  x + 2
end

def g(x)
  x + 3
end 

我们可以将compose1定义为:

def compose1(f,g)
  lambda { |x| send(f, send(g, x) ) }
end

为此,我们需要将h定义为:

h = compose1(:f, :g)

您需要将方法名称作为send的字符串/符号传递才能工作。然后,你可以做

h.call 3 # => 8。更多信息可以在here

找到

答案 2 :(得分:2)

使用lambdas

def compose1(f,g)
  return lambda{ |x| f.call(g.call(x)) }
end

运行示例

compose1(lambda{|a| a + 1}, lambda{|b| b + 1}).call(1)