Ruby代码:
def fnAdd(x)
return ->(y) { x + y }
end
add1 = 1.method(:fnAdd)
puts add1.call(10)
输出: Proc:0x007f52658d3330@main.rb:2(lambda)
我遇到上述代码中获得所需输出的问题。
我基本上试图在Ruby中编写以下Scala代码(它调用一个返回另一个函数的函数)。
Scala代码:
def fnAdd (x:Int) = {
(y:Int) => x + y
}
var add1 = fnAdd (1)
var add2 = fnAdd (2)
println(add1(10))
println(add2(3))
输出: 11 5
我已尝试将代码转换为Ruby,但我不确定它是否正确。我不理解输出,它似乎是某种过程对象。
有人可以解释一下我需要改变什么来获得所需的输出吗?
答案 0 :(得分:0)
我不确定你的第一个例子是如何运行的,因为它在我的机器上产生无论如何,NameError
。#method
用于访问方法 on 特定对象。您已经定义了一个已经过咖喱的独立方法,而不是Fixnum
类中的一个方法。所以你只需要将其称为方法。
add1 = fnAdd(1)
此外,Ruby在返回方法中的最后一个表达式方面与Scala具有相同的行为,因此在这种情况下您不需要使用return
。
修改强>
感谢@JörgWMittag指出了一些缺陷。在顶层定义#fnAdd
使其成为Object
上的私有实例方法。由于Ruby中的所有内容都是对象,Fixnum
继承自Object
类。因此,1.method(:fnAdd)
只是给你fnAdd
方法而不实际传递任何参数。因此,它仍然希望被调用两次。
fnAddMethod = 1.method(:fnAdd)
add1 = fnAddMethod.call(1)
puts add1.call(10)
然而,这将是非常单一的,所以最好坚持使用更简单的解决方案。