代码之家  ›  专栏  ›  技术社区  ›  AmateurDev

Scala->Ruby转换:混乱的输出

  •  0
  • AmateurDev  · 技术社区  · 7 年前

    Ruby代码:

    def fnAdd(x) 
        return ->(y) { x + y }
    end
    
    add1 = 1.method(:fnAdd)
    
    puts add1.call(10)
    

    输出: 过程:0x007f52658d3330@main.rb:2(λ)

    我在上述代码中获取所需输出时遇到问题。

    我基本上是在尝试用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对象。

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

    1 回复  |  直到 7 年前
        1
  •  0
  •   Silvio Mayolo    7 年前

    我不确定您的第一个示例是如何运行的,因为它生成了 NameError 在我的机器上。 不管 #method 用于访问方法 在…上 特定对象。您已经定义了一个已经curry的独立方法,而不是 Fixnum 班因此,您只需将其作为方法调用。

    add1 = fnAdd(1)
    

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

    编辑:

    感谢@jrgwittag在这里指出了一些缺陷。决定性的 #fnAdd 在顶层,使其成为上的私有实例方法 Object . 由于Ruby中的一切都是对象, 固定数量 继承自 对象 班因此 1.method(:fnAdd) 只是给你 fnAdd 方法,而不实际传递任何参数。因此,它仍然希望被调用两次。

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

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