【问题标题】:How can a closure escape when it's used in a nested function?在嵌套函数中使用闭包时如何逃逸?
【发布时间】:2017-04-30 23:22:40
【问题描述】:

我正在使用递归定义的数据结构。将其归结为数组,这就是我为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 []
    }
}

这让我觉得很好地使用了嵌套函数:遍历代码并没有逃脱它需要的唯一范围。 (让我们假设这里的情况确实如此。)

然而,斯威夫特抱怨:

关闭非转义参数“mut”的声明可能允许它转义。

当然,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 现在可以以同样的方式逃跑了吗?

我错过了什么?有没有办法让第一个版本工作?

【问题讨论】:

  • 可能只是编译器中的一个错误。我会打开一个错误报告。嵌套函数并不总是得到应有的支持。
  • @RobNapier 很高兴知道这可能不是我!好像已经是reported了。

标签: swift scope swift3 closures nested-function


【解决方案1】:

这似乎是由于分析转义行为的组件存在缺陷;这显然有点过于防御性了。

this bug report。当前状态:打开,未分配。

【讨论】:

    猜你喜欢
    • 2015-06-10
    • 2012-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-07
    • 1970-01-01
    • 2020-10-20
    • 2023-03-28
    相关资源
    最近更新 更多