【问题标题】:Scala -> Ruby conversion: Confusing outputScala -> Ruby 转换:令人困惑的输出
【发布时间】:2018-01-04 20:17:50
【问题描述】:

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

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

【问题讨论】:

    标签: ruby lambda functional-programming proc


    【解决方案1】:

    我不确定您的第一个示例是如何运行的,因为它在我的机器上生成了一个 NameError 不管怎样,#method 是用于访问方法 on em> 特定对象。您已经定义了一个已经被柯里化的独立方法,而不是 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)
    

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

    【讨论】:

    • 嗯,在顶层定义的方法变成了Object的私有方法,其中Integer是一个子类,1是一个实例,所以它会继承fnAdd。但是,它将是私有的(除非您在 IRb 中执行代码,不幸的是它的行为不同)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-03
    • 2013-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-21
    • 2010-12-23
    相关资源
    最近更新 更多