在__consuming中,有一些函数在Sequence.swift中占优势(很可能还有其他地方,但我还没有仔细看过)。我知道它是某种类型的声明修饰符,但我不知道它能做什么。
发布于 2018-07-11 20:13:17
据我所知,__consuming实际上还没有做任何事情。它是在只移动类型的实现之前添加的,在这一点上,它将被用来表示使用调用它的值的方法(即该值将从调用方移动到被调用者)。
为了举例说明,请考虑以下伪代码:
// Foo is a move-only type, it cannot be copied.
moveonly struct Foo {
consuming func bar() { // Method is marked consuming, therefore `self` is moved into it.
print(self) // We now 'own' `self`, and it will be deinitialised at the end of the call.
}
}
let f = Foo()
f.bar() // `bar` is a `consuming` method, so `f` is moved from the caller to the callee.
print(f) // Invalid, because we no longer own `f`.该属性目前以两个下划线作为前缀,以表明在真正实现仅移动类型之前,用户不应该使用该属性,此时可能会将其重命名为consuming。
正如您已经发现的,一些标准库协议要求__consuming,以表明它们可以通过只移动类型的消费方法以及非消费方法来满足。这在很大程度上与mutating协议要求表明,它可以由值类型上的mutating方法或其他非变异方法来满足(但据我所知,还没有实际的编译器逻辑支持__consuming的检查)。
例如,filter(_:)对Sequence的需求已被标记为消耗,因为采用的仅移动元素序列将需要能够将适用的元素移动到结果数组中,从而使序列无效。
在实现仅移动类型之前添加属性的原因是为了准备Swift 5 ABI稳定性冻结。正如马丁所说,这将在论坛上进行更详细的讨论:
https://stackoverflow.com/questions/51292799
复制相似问题