gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 07:03:43 25 4
gpt4 key购买 nike

您可以使用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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com