arrays - 如果您不知道数组元素的索引,则删除该元素的语法是什么?

标签 arrays raku

您可以使用adverb :delete在 Perl 6 中,如果您知道数组元素的索引,则删除该元素:

my @letters = <a b c>; @letters[0]:delete; say @letters
# OUTPUT: «[(Any) b c]␤»

但是,如果您不知道索引,则无法执行此操作:

my @letters = <a b c>; $_:delete if $elem eq 'a' for @letters
#ERROR! → Variable '$_:delete' is not declared

如果你声明循环变量is rw仍然是同样的问题:

my @letters = <a b c>; for @letters -> $l is rw { $l:delete if $l eq 'a' }; say @letters
#ERROR! → Variable '$l:delete' is not declared

似乎没有其他删除数组元素的方法。 equivalent for Perl 5's delete事实上,指向那个副词。您可以使用 splice但你必须再次知道索引。实现似乎是 this function, DELETE-POS ,它实际上需要知道数组索引。

所以问题是,如标题所示,如果您只有元素本身的句柄,而不是其索引,是否有办法删除数组(或关联数组)元素?

最佳答案

取决于您所说的删除。在数组内部,执行 DELETE-POS 会将数组中的元素绑定(bind)到 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]

但这似乎不是您想要的。

关于arrays - 如果您不知道数组元素的索引,则删除该元素的语法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50655066/

相关文章:

main - 改变参数在传递给子 MAIN 之前的处理方式

mixins - 有没有办法(隐式)删除 Raku 角色混入?

C# 将文件行存储到数组中,然后保存选定的行

javascript - 了解 Javascript Codewars 挑战

printing - Perl6 Terminal::Print 如何提示用户输入文本?

optimization - 为什么内联if语句的平均速度至少比其他类型的if慢三分之一?

raku - 语法和 Unicode 字符

javascript - 在php中获取数组索引

python - Numpy 无法将列表转换为 np 数组

python - 在 Python 中将两个数组 append 在一起