在嵌套函数中使用闭包如何逃逸?
How can a closure escape when it's used in a nested function?
我正在研究递归定义的数据结构。归结为数组,这就是我为 map
:
所做的
func map<T, U>(_ arr: [T], _ mut: T -> U) -> [U] {
func recMap(_ i : Int) -> [U] {
if i >= arr.count {
return []
} else {
return [mut(arr[i])] + recMap(i+1)
}
}
if arr.count > 0 {
return recMap(0)
} else {
return []
}
}
这让我印象深刻,因为它很好地使用了嵌套函数:遍历代码不会逃脱它唯一需要的范围。 (让我们假设这里确实是这种情况。)
然而,Swift 抱怨:
Declaration closing over non-escaping parameter 'mut' may allow it to escape.
当然,recMap
可能会做一些奇怪的事情,但事实并非如此;是编译器无法解决的问题吗?
加深我困惑的是这段代码有效:
private func recMap<T, U>(_ arr: [T], _ i : Int, _ mut: (T) -> U) -> [U] {
if i >= arr.count {
return []
} else {
return [mut(arr[i])] + recMap(arr, i+1, mut)
}
}
func map<T, U>(_ arr: [T], _ mut: (T) -> U) -> [U] {
if arr.count > 0 {
return recMap(arr, 0, mut)
} else {
return []
}
}
当然,mut
现在可以用同样的方法逃跑了?
我错过了什么?有没有办法让第一个版本工作?
这似乎是由于分析转义行为的组件存在缺陷;这显然有点过于防御了。
参见 this bug report。当前状态:打开,未分配。
我正在研究递归定义的数据结构。归结为数组,这就是我为 map
:
func map<T, U>(_ arr: [T], _ mut: T -> U) -> [U] {
func recMap(_ i : Int) -> [U] {
if i >= arr.count {
return []
} else {
return [mut(arr[i])] + recMap(i+1)
}
}
if arr.count > 0 {
return recMap(0)
} else {
return []
}
}
这让我印象深刻,因为它很好地使用了嵌套函数:遍历代码不会逃脱它唯一需要的范围。 (让我们假设这里确实是这种情况。)
然而,Swift 抱怨:
Declaration closing over non-escaping parameter 'mut' may allow it to escape.
当然,recMap
可能会做一些奇怪的事情,但事实并非如此;是编译器无法解决的问题吗?
加深我困惑的是这段代码有效:
private func recMap<T, U>(_ arr: [T], _ i : Int, _ mut: (T) -> U) -> [U] {
if i >= arr.count {
return []
} else {
return [mut(arr[i])] + recMap(arr, i+1, mut)
}
}
func map<T, U>(_ arr: [T], _ mut: (T) -> U) -> [U] {
if arr.count > 0 {
return recMap(arr, 0, mut)
} else {
return []
}
}
当然,mut
现在可以用同样的方法逃跑了?
我错过了什么?有没有办法让第一个版本工作?
这似乎是由于分析转义行为的组件存在缺陷;这显然有点过于防御了。
参见 this bug report。当前状态:打开,未分配。