Как работает членство в элементе в Perl 6? - PullRequest
0 голосов
/ 25 мая 2018

Рассмотрим этот пример

my @fib =  (1,1, * + * … * > 200).rotor(2 => -1); 
say @fib[0] ∈  @fib; # prints True

Первый оператор создает Последовательность 2-элементных подпоследовательностей с помощью функции ротор .@fib будет содержать (1,1), (1,2) и так далее.Совершенно очевидно, что первый элемент последовательности является частью последовательности.Или это так?

my @fib =  (1,1, * + * … * > 200).rotor(2 => -1); 
say @fib[0], @fib[0].^name; # OUTPUT: «(1 1)List␤»

Итак, первый элемент содержит список со значением (1 1).Хорошо, давайте посмотрим

my $maybe-element = (1,1); 
say $maybe-element, $maybe-element.^name; # OUTPUT: «(1 1)List␤»
say $maybe-element ∈  @fib;               # OUTPUT: «False␤»

Подождите, что?Давайте посмотрим ...

my $maybe-element = @fib[0]; 
say $maybe-element ∈ @fib; # OUTPUT: «True␤»

Гул.Так что это не контейнер.Но

say (1,1).List === (1,1).List; # OUTPUT: «False␤»

И

say (1,1).List == (1,1).List; # OUTPUT: «True␤»

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

Может быть, вопрос заключается в том, почему одни и те же литералы генерируют совершенно разные объекты, но, вероятно, есть хороший и, скорее всего, связанный с безопасностью ответ на этот вопрос.

1 Ответ

0 голосов
/ 25 мая 2018

Так что я думаю, что ∈ использует идентичность объекта, а не равенство.

Это правильно.

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

Вы можете использовать .grep или .first и оператор равенства по вашему выбору (предположительно, вы хотите eqv здесь), или вы можете попытаться найти тип значения в виде списка.Сверху головы я не знаю, встроен ли кто-нибудь в Perl 6.

...