gpt4 book ai didi

raku - 检查列表是否为空 (Raku)

转载 作者:行者123 更新时间:2023-12-03 16:55:43 26 4
gpt4 key购买 nike

FAQ:在 Raku 中如何检查列表是否为空?
是否有比以下更惯用的方法:

my @l = ();
say @l.elems == 0;
say @l == ();
say @l.Bool;

doc on list推荐 smartmatching
say $l ~~ ();
  • 你知道其他方法吗?
  • 你能解释为什么() === ()即使 "" === "" 也是错误的是对的:我不清楚。
  • 最佳答案

    其中建议:

    say @l.elems == 0;

    这是一个很好避免的方法,因为它会强制对惰性列表中的所有元素进行评估(如果迭代器标记为惰性,则可能会导致异常,因为替代方法将一直运行,直到所有内存都用完为止)。
    say @l == ();

    这有效,但具有与上述相同的问题。 ==运算符是数字相等,因此它将双方强制为一个数字,然后比较它们。这也归结为 @l.elems (通过。 @l.Numeric)。你可以把这个表格写成更便宜的 @l == 0 ,如果您真的想询问总共有多少个元素,这是最简洁的方法。
    say @l.Bool;

    这更好,因为在惰性列表中,它最多只强制评估一个元素来回答问题。然而,这实际上与所问的相反:这是 True如果数组不为空。使用 ? 更自然和 !像这样的前缀运算符:
    say ?@l; # is not empty
    say !@l; # is empty

    尽管通常您甚至不需要这样做,因为诸如 if 之类的事情和 unless提供一个 bool 上下文。因此可以写:
    if @l { }        # not empty
    unless @l { } # empty

    这些可能是最好的方法。

    至于其他建议:
    say $l ~~ ();

    这很好,虽然可能比 bool 化方法慢。

    () === () is wrong even if "" === "" is right



    那是因为 List是引用类型,而不是值类型。自 ()每次构造一个不同的空列表,它们是不同的对象,因此将比较为不相同。您可以使用 eqv反而:
    say () eqv ()    # True

    但是不要用它来检查列表是否为空,因为它可能过于具体。例如:
    my @l; say @l eqv ();    # False
    my @l; say @l eqv []; # True

    这是因为 ()类型为 List , 而 my @l声明一个 Array .通常,您不想关心真正存在的类型。

    最后,关于这一行:
    my @l = ();
    ()的分配毫无意义; my @a已经创建了一个空 Array .事实上,这是一种很常见的代码味道,Comma IDE 对此给出了一个微弱的警告:

    Warning

    关于raku - 检查列表是否为空 (Raku),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60858190/

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