我在学习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中有类似的语法吗?
答案 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)
让我们说f
和g
是以下方法:
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)