首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >"__consuming“在Swift中做什么?

"__consuming“在Swift中做什么?
EN

Stack Overflow用户
提问于 2018-07-11 19:19:27
回答 2查看 3.4K关注 0票数 23

__consuming中,有一些函数在Sequence.swift中占优势(很可能还有其他地方,但我还没有仔细看过)。我知道它是某种类型的声明修饰符,但我不知道它能做什么。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-07-11 20:13:17

据我所知,__consuming实际上还没有做任何事情。它是在只移动类型的实现之前添加的,在这一点上,它将被用来表示使用调用它的值的方法(即该值将从调用方移动到被调用者)。

为了举例说明,请考虑以下伪代码:

代码语言:javascript
复制
// 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稳定性冻结。正如马丁所说,这将在论坛上进行更详细的讨论:

票数 31
EN

Stack Overflow用户

发布于 2018-07-11 19:38:13

它是由宏在属性中定义的Attr.def

代码语言:javascript
复制
CONTEXTUAL_SIMPLE_DECL_ATTR(__consuming, Consuming,
  OnFunc | OnAccessor |
  DeclModifier |
  UserInaccessible |
NotSerialized, 40)
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51292799

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档