Назначение массива perl6: указатель или копия?

В perl6 я хочу присвоить массив другому массиву и сделать результирующий массив отдельным объектом, но кажется, что ни прямое присвоение, ни клонирование не могут сделать то, что я хочу. Есть ли способ скопировать массив с помощью одного выражения вместо написания процедуры цикла?

To exit type 'exit' or '^D'
> my @a=<a b c d e>
[a b c d e]
> my @b = <1 2 3 4 5 6 7>
[1 2 3 4 5 6 7]
> my @c = @a
[a b c d e]
> @c[3]
d
> @c[3]=3;
3
> @c
[a b c 3 e]
> @a
[a b c d e]
> @c === @a
False
> @c == @a
True          # this is unexpected, @c and @a should be different, right?
> my @[email protected]
[a b c d e]
> @x[3]=3
3
> @x
[a b c 3 e]
> @x === @a
False
> @x == @a
True         # unexpected, @x and @a should be distinct things, right?
>

Большое тебе спасибо !!!

лиспрог


person lisprogtor    schedule 29.11.2016    source источник


Ответы (1)


Вам не повезло, что вы не сравнили с @b, который мог бы помочь вам понять это :)

== — это числовое сравнение, поэтому, когда вы просили сравнить список как число, он выбрал количество элементов в качестве представления. Операторы в Perl 5 или 6 принуждают используемые типы. Если вы хотите проверить, совпадают ли элементы массива, попробуйте оператор eqv.

Сравнение длин массивов, поэтому верно следующее:

@a == @c == @x == 5

Пытаться:

my @a = <a b c d e>;
my @b = <1 2 3 4 5>;
@a eqv @b;

Возможно, вы захотите ознакомиться с некоторыми документами по этим операторам. Оператор Smart Match ~~, вероятно, больше того, что вы ожидали от ==.

https://docs.perl6.org/routine/$EQUALS_SIGN$EQUALS_SIGN https://docs.perl6.org/routine/$TILDE$TILDE

person Matt Oates    schedule 29.11.2016
comment
Спасибо Мэтт!! Итак, когда я назначаю один массив другому, содержимое копируется, и это разные массивы, верно? - person lisprogtor; 30.11.2016
comment
Да и нет. Вы получаете неглубокую копию для скалярных типов. Таким образом, вещи, которые являются контейнерами, например, говорят, что другой массив, вы получаете только новый контейнер, указывающий на тот же список. Итак, пример, когда это может быть не то, что вы ожидаете: my @a = [1,[2,3]]; my @b = @a; @b[1][0] = 4; Это также изменит 2 на 4 в @a! - person Matt Oates; 30.11.2016
comment
Если вам нужна глубокая копия, ответ на этот вопрос был дан ранее здесь a-deep-copy-of-a-nested-data-structure" title="имеет ли Perl 6 встроенный инструмент для создания глубокой копии вложенной структуры данных"> stackoverflow.com/questions/38582873/ - person Matt Oates; 30.11.2016