在学习 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 中是否有类似的语法?
您可以在 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 的真正强项——它可以完成,但在我看来它看起来有点混乱。
可以说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
. 更多信息可以在这里找到
使用 lambda
def compose1(f,g)
return lambda{ |x| f.call(g.call(x)) }
end
跑步的例子
compose1(lambda{|a| a + 1}, lambda{|b| b + 1}).call(1)