gpt4 book ai didi

swift - 为什么实例方法在 Swift 中有这种类型?

转载 作者:搜寻专家 更新时间:2023-11-01 07:07:00 24 4
gpt4 key购买 nike

给定这段代码:

struct Foo {
func f() {}
}

let f = Foo.f // (Foo) -> () -> ()

为什么 f 的类型是 (Foo) -> () -> () 而不是 (Foo) -> () ?像 Foo.f 这样的实例方法可以直接与 (Foo) -> … 类型的自由函数互换吗?

最佳答案

Why does f have the type (Foo) -> () -> () and not (Foo) -> ()?

这就是目前未应用的实例方法引用的实现方式;它们是柯里化(Currying)函数,遵循“给我一个实例,我会给你一个部分应用的实例方法”(部分应用该实例)的模型。

然而,这在某些领域是有问题的,首先是因为它们通常采用 (Self, Args...) -> Ret 形式更有用,但更重要的是因为它是因为它会导致围绕 mutating 方法的问题。在当前系统中,这些最终看起来像 (inout Self) -> (Args...) -> Ret,这是有问题的,因为只有 inout 的突变窗口在通话期间持续。

这意味着以下当前可以编译,但实际上是未定义的行为:

struct S {
var i: Int

mutating func increment() {
i += 1
}
}

var s = S(i: 0)
let unappliedIncrement = S.increment
let increment = unappliedIncrement(&s)
increment() // undefined behaviour

这些是SE-0042背后的主要动机,这会将未应用的实例方法引用从 (Self) -> (Args...) -> Ret 形式更改为
(Self, Args ...) -> Ret(对于 inoutSelf 将是 inout Self – 允许实例的突变而不UB)。

该提案尚未实现,但一旦实现,假设空参数列表变平(因此您不会以尾随 Void 参数结束),Foo. f 确实是
(Foo) -> Void 类型。

关于swift - 为什么实例方法在 Swift 中有这种类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47316599/

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