Scala - > Ruby转换:令人困惑的输出

时间:2018-01-04 20:17:51

标签: ruby lambda functional-programming proc

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,但我不确定它是否正确。我不理解输出,它似乎是某种过程对象。

有人可以解释一下我需要改变什么来获得所需的输出吗?

1 个答案:

答案 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)

然而,这将是非常单一的,所以最好坚持使用更简单的解决方案。