Scala -> Ruby 转换:混淆输出

Scala -> Ruby conversion: Confusing output

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 代码(调用一个 returns 另一个函数的函数)

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,但我不确定它是否正确。我不明白输出,它似乎是某种 proc 对象。

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

我不确定你的第一个例子是如何 运行,因为它在我的机器上产生了 NameError 不管怎样,#method 用于访问 on 特定对象的方法。您已经定义了一个独立的方法,它已经被柯里化了,而不是 Fixnum class 中的一个。所以你只需要将它作为一个方法来调用。

add1 = fnAdd(1)

此外,Ruby 在返回方法中的最后一个表达式方面与 Scala 具有相同的行为,因此在这种情况下您不需要使用 return

编辑:

感谢@JörgWMittag 指出了这里的一些缺陷。在顶层定义 #fnAdd 使其成为 Object 上的私有实例方法。由于 Ruby 中的所有内容都是对象,因此 Fixnum 继承自 Object class。因此,1.method(:fnAdd) 只是为您提供了 fnAdd 方法,而实际上并未向其传递任何参数。因此,它仍然期望被调用两次。

fnAddMethod = 1.method(:fnAdd)
add1 = fnAddMethod.call(1)
puts add1.call(10)

但是,这将非常不合常理,因此最好坚持使用更简单的解决方案。