【发布时间】:2014-07-27 16:12:34
【问题描述】:
我正在阅读文档,并且经常对语言的一些设计决策摇头。但真正让我困惑的是数组是如何处理的。
我冲到操场上试了一下。你也可以试试。所以第一个例子:
var a = [1, 2, 3]
var b = a
a[1] = 42
a
b
这里a 和b 都是[1, 42, 3],我可以接受。引用了数组 - 好的!
现在看这个例子:
var c = [1, 2, 3]
var d = c
c.append(42)
c
d
c 是 [1, 2, 3, 42] 但 d 是 [1, 2, 3]。也就是说,d 在上一个示例中看到了变化,但在这个示例中没有看到。文档说这是因为长度改变了。
现在,这个怎么样:
var e = [1, 2, 3]
var f = e
e[0..2] = [4, 5]
e
f
e 是[4, 5, 3],这很酷。有一个多索引替换很好,但是f STILL 没有看到变化,即使长度没有改变。
总而言之,如果您更改 1 个元素,则对数组的常见引用会发生变化,但如果您更改多个元素或追加项目,则会创建副本。
对我来说,这似乎是一个非常糟糕的设计。我这样想对吗?有什么原因我不明白为什么数组应该这样吗?
编辑:数组已更改,现在具有值语义。更理智!
【问题讨论】:
-
为了记录,我认为这个问题不应该结束。 Swift 是一门新语言,所以在我们学习的过程中会有一段时间会出现这样的问题。我觉得这个问题很有趣,我希望有人能提出令人信服的辩护理由。
-
@Joel 很好,问程序员,Stack Overflow 是针对特定的无主见的编程问题。
-
@bjb568:不过,这不是意见。这个问题应该用事实来回答。如果某个 Swift 开发人员来回答“我们是为 X、Y 和 Z 做的那样”,那么这就是直截了当的事实。您可能不同意 X、Y 和 Z,但如果为 X、Y 和 Z 做出决定,那么这只是语言设计的历史事实。就像我问为什么
std::shared_ptr没有非原子版本时一样,there was an answer based on fact, not opinion(事实是委员会考虑过但出于各种原因不想要它)。 -
@JasonMArcher:只有最后一段是基于意见(是的,也许应该删除)。问题的实际标题(我将其视为实际问题本身)可以用事实来回答。 有数组被设计成按照它们的工作方式工作的原因。
-
是的,正如 API-Beast 所说,这通常称为“Copy-on-Half-Assed-Language-Design”。