gpt4 book ai didi

Swift curried 函数的行为与扩展版本不同

转载 作者:可可西里 更新时间:2023-11-01 01:06:45 26 4
gpt4 key购买 nike

我在 Swift 中有一个柯里化(Currying)函数:

func counter(var val: Int)() -> () {
val++
println(val)
}

根据 this answer它应该等同于:

func counter(var val: Int) -> (() -> ()) {
func curryFunc() {
val++
println(val)
}
return curryFunc
}

但是,当我运行以下代码时:

let x = counter(3)
x()
x()

对于第一个,我得到 44;而对于第二个,我得到 45

我使用的是 Xcode 6.0.1 版本。

最佳答案

不同之处在于,在第一个版本中,柯里化(Currying)函数的主体是一个普通的函数实现,而在第二个版本中有一个闭包。如文档中所述:

Closures can capture and store references to any constants and variables from the context in which they are defined.

在您的例子中,val 被捕获,并保留在连续的调用中。

附录 - 如果你想让你的第二个函数表现得像柯里化(Currying)函数,你应该将参数存储在函数体内声明的变量中:

func counter(val: Int) -> (() -> ()) {
func curryFunc() {
var unretainedVal = val
unretainedVal++
println(unretainedVal)
}
return curryFunc
}

捕获的值 val 不会改变,因此该函数保留对其原始值的引用。

关于Swift curried 函数的行为与扩展版本不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25908803/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com