Зависит от того, что вы называете delete
.Внутри массивов выполнение DELETE-POS
связывает элемент в массиве с nqp::null
, что отбрасывает любой контейнер, находящийся в этой позиции.На уровне HLL это представлено типом массива:
my Str @letters = <a b c>;
@letters[1]:delete;
say @letters; # [a (Str) c]
Однако вы можете добиться того же эффекта, назначив Nil
:
my Str @letters = <a b c>;
@letters[1] = Nil;
say @letters; # [a (Str) c]
В этом случаеконтейнер в этом элементе остается прежним, вы просто позволяете ему вернуться в свое «естественное» состояние.И если вы довольны этим типом удаления, вы также можете использовать его в цикле:
my Str @letters = <a b c>;
$_ = Nil if $_ eq "b" for @letters;
say @letters; # [a (Str) c]
Когда я сказал: вернуться к своему естественному состоянию, это также включает любое значение по умолчанию:
my Str @letters is default<foo> = <a b c>;
$_ = Nil if $_ eq "b" for @letters;
say @letters; # [a foo c]
Если вы действительно хотите исключить элементы из списка без , сохраняя существующие элементы на своих местах, вы, конечно, можете использовать grep
:
my @letters = <a b c>;
@letters .= grep: * ne "b";
say @letters; # [a c]
Но это не похоже на то, что вы намеревались.