【问题标题】:Is destructuring assignment guaranteed to be parallel assignment in Swift?解构赋值是否保证在 Swift 中是并行赋值?
【发布时间】:2019-10-29 20:13:58
【问题描述】:

我正在查看 Swift 语言参考中的 the description of the assignment operator。是否保证并行进行解构赋值?与串行分配相反。我没有在赋值运算符的描述中看到这一点。

需要明确的是,是否保证(a, b) = (b, a)(其中abvar)等价于foo = aa = bb = foo,其中foo 是保证不存在的变量,而不是a = bb = a(这将产生ab两者具有相同的值)。我尝试了(a, b) = (b, a),它似乎可以并行工作,但这与记录在案的行为描述不同。

【问题讨论】:

  • “但这与记录在案的行为描述不同。”好吧,文档没有提到它,所以你不能说它不是“相同的”。不幸的是,文档没有说很多事情。而且由于文档没有说,我将其称为 swift 编译器的“实现细节”。
  • @Sweeper 据我了解,OP 询问是否有可能以导致a 破坏b 或反之亦然的方式发生此分配。如果是这样,那是语言语义的一个重要问题,而不仅仅是一个实现细节。
  • “我尝试过 (a, b) = (b, a),它似乎可以并行工作,但这与记录在案的行为描述不同。”您认为哪个“记录在案的行为描述”是矛盾的?你指的是“从值的每一部分到表达式的对应部分进行赋值”这句话吗?
  • @Alexander 我知道,但文档没有说明是否会发生破坏。因此,它是一个实现细节,从某种意义上说,由编译器决定如何处理赋值。从理论上讲,我可以编写一个几乎像swiftc 一样工作的编译器,除了它按顺序进行赋值,并且仍然称它为“Swift 编译器”,因为它按照参考文献所说的那样工作。
  • @Sweeper 你确定你真的想要那个吗? 1) 没有语言委员会和规范使您能够更快地移动 waaaaaay,2) 只有两种 Swift 实现(据我所知,Swift.org 和 Silver Elements Compiler),所以几乎不需要同步许多独立工作的团队,不像 JS(有几十个实现)等等。

标签: swift assignment-operator destructuring


【解决方案1】:

元组是值类型,一旦构建,它们就独立于作为它们一部分的值。

var a = 2
var b = 3
var t1 = (a, b)
print(t1) // (2, 3)
a = 4
print(t1) // (2, 3)

因此元组(a, b) 携带两个变量的实际值,这就是(b, a) = (a, b) 赋值工作没有问题的原因。在幕后,实际赋值为(b, a) = (2, 3)(假设ab 具有上述代码sn-p 中的值)。

【讨论】:

    猜你喜欢
    • 2017-11-07
    • 1970-01-01
    • 1970-01-01
    • 2018-03-24
    • 2014-09-19
    • 1970-01-01
    • 2018-08-20
    • 2021-07-01
    相关资源
    最近更新 更多