Рассмотрим этот пример
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»
Так что я думаю, ∈
использует идентичность объекта, а не равенство.В таком случае, как мы можем проверить в наборах или последовательностях списков, включен ли независимо генерируемый список с использованием этого оператора?Должны ли мы использовать другую другую стратегию?
Может быть, вопрос заключается в том, почему одни и те же литералы генерируют совершенно разные объекты, но, вероятно, есть хороший и, скорее всего, связанный с безопасностью ответ на этот вопрос.