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)
但是,这将非常不合常理,因此最好坚持使用更简单的解决方案。
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)
但是,这将非常不合常理,因此最好坚持使用更简单的解决方案。