Я читаю документацию, и я постоянно качаю головой в некоторых дизайнерских решениях языка. Но то, что действительно озадачило меня, заключается в том, как обрабатываются массивы.
Я бросился на площадку и попробовал их. Вы можете попробовать их тоже. Итак, первый пример:
var a = [1, 2, 3]
var b = a
a[1] = 42
a
b
Здесь a
и b
являются как [1, 42, 3]
, которые я могу принять. Массивы ссылаются - OK!
Теперь посмотрим на этот пример:
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 не видит изменения, даже если длина не изменилась.
Итак, чтобы подвести итог, общие ссылки на массив видят изменения, если вы меняете один элемент, но если вы меняете несколько элементов или добавляете элементы, делается копия.
Мне кажется, что это очень плохой дизайн. Я прав, думая об этом? Есть ли причина, почему я не понимаю, почему массивы должны действовать так?
EDIT: Массивы изменились и теперь имеют семантику значений. Гораздо более разумно!