【发布时间】:2014-06-07 17:32:32
【问题描述】:
这是我做我想做的事的失败尝试:
var currentNum = 0
def adder = (x:Int, y:Int) => x+y
def getNumAdder = {x: Int =>
val currentNumSnapshot = currentNum
adder(x, currentNumSnapshot)
}
currentNum = 5
val addFive = getNumAdder
currentNum = 9
val addNine = getNumAdder
println("10 plus 5 is "+addFive(10))
println("10 plus 9 is "+addNine(10))
":paste" 在 Scala REPL 中,你会得到这个:
10 plus 5 is 19
10 plus 9 is 19
我希望能够调用 getNumAdder 并获得一个将当前值的快照添加到输入数字的函数。我可以更改什么以获得所需的行为?
更新:
根据促进引用透明度的警告,我相信这段代码,一个简单的 Scala 柯里化示例,也可以满足我的需要。
var currentNum = 0
def adder(x:Int) = (y:Int) => x+y
def getNumAdder(input: Int) = {
adder(input)
}
currentNum = 5
val addFive = getNumAdder(currentNum)
【问题讨论】:
-
我认为编写这样的代码不是一个好习惯。它取决于上下文并且不透明。