Есть ли случаи, когда я должен использовать `elems` с массивом, чтобы он работал? - PullRequest
6 голосов
/ 04 апреля 2020

Прочитав этот ответ Я просмотрел свой код и нашел несколько мест, где я использую elems с массивами.

Я мог бы удалить все elems, не влияя на код:

my @a = 1, 2, 3, 4, 5;
my $b = [ 1, 2, 3, 4 ];

my $i = 2;
say $i + @a.elems;
say $i + @a;

say "===============";
say @a.elems;
say 0 + @a;

say "===============";
say $b.elems / 2;
say $b / 2;

say "===============";
while state $c++ > $b.elems {
    say $c;
}
while state $d++ > $b {
    say $d;
}

Это заставило меня задуматься о том, существуют ли ситуации, когда для работы кода нужно вызывать массивы с помощью функции elems.

1 Ответ

7 голосов
/ 04 апреля 2020

Всякий раз, когда оператор нумерации c видит Iterable в качестве одного из своих операндов, он вызывает для него метод .elems. Иногда это приводит к выбрасыванию Failure или Exception:

$ raku -e 'say (1 ... *) + 42'
Cannot .elems a lazy list

Имейте в виду, использование .elems в вашем коде имеет 2 преимущества:

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