检查列表是否为空(Raku)

2024-01-08

常见问题解答:在 Raku 中如何检查列表是否为空? 还有比以下更惯用的方法吗?

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

The 名单上的文档 https://docs.perl6.org/type/List推荐智能匹配 https://docs.raku.org/language/operators#infix_~~

say $l ~~ ();
  1. 你还知道其他方法吗?
  2. 你能解释一下为什么吗() === ()是错误的,即使"" === ""是对的:我对此不太清楚。

其中建议的:

say @l.elems == 0;

这是一个很好的避免方法,因为它强制评估惰性列表中的所有元素(如果有标记为惰性的迭代器,这可能会导致异常,因为替代方案将一直运行,直到所有内存耗尽)。

say @l == ();

这可行,但有与上面相同的问题。这==运算符是数字相等,因此它将强制两边都为数字,然后比较它们。这也归结为@l.elems (via. @l.Numeric)。你可以更便宜地写这个表格@l == 0,如果您确实想询问总共有多少个元素,这是最好的方法。

say @l.Bool;

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

say ?@l; # is not empty
say !@l; # is empty

虽然很多时候你甚至不需要做that,因为像这样的事情if and unless提供布尔上下文。因此可以这样写:

if @l { }        # not empty
unless @l { }    # empty

这些可能是最好的方法。

至于其他建议:

say $l ~~ ();

这很好,尽管可能比布尔化方法慢。

() === ()是错误的,即使"" === ""是对的

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

say () eqv ()    # True

但不要用它来检查列表是否为空,因为它可能过于具体。例如:

my @l; say @l eqv ();    # False
my @l; say @l eqv [];    # True

这是因为()属于类型List, while my @l声明一个Array。一般来说,您不想关心到底是什么类型。

最后,关于这一行:

my @l = ();

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

检查列表是否为空(Raku) 的相关文章

随机推荐

  • SQL - 如果行数大于则插入

    我创建了一个 SQL 查询 该查询将从 Oracle 链接服务器返回行 例如 该查询工作正常 将返回 40 行 我希望仅当返回的行数大于 40 时才将结果插入到表中 我的想法是 我可以创建一个触发器来发送一封电子邮件 告知该号码已被泄露 D
  • 从 C# 调用包含函数指针的 DLL 函数

    我有一个用 C 编写的 DLL 其中包含导出函数 该函数具有用作回调函数的函数指针 C DllExport unsigned int DllFunctionPointer unsigned int i unsigned int TimesT
  • Phantomjs Function.prototype.bind

    对我知道那个 Phantomjs 不支持函数绑定 但也许我可以用别的东西 或者说page open不使用bind 看起来还可以 但是有些网站 返回错误 TypeError undefined is not a function evalua
  • Windows 上的 Python - 如何等待多个子进程?

    如何在 Windows 上的 Python 中等待多个子进程 而不需要主动等待 轮询 像这样的东西almost对我有用 proc1 subprocess Popen python mytest py proc2 subprocess Pop
  • 如何获取传递给函数的变量的原始变量名[重复]

    这个问题在这里已经有答案了 是否可以获取传递给函数的变量的原始变量名 例如 foobar foo def func var print var origname So that func foobar Returns gt gt fooba
  • 警报管理器 2 次

    我有一个BroadcastReceiver called AlarmReceiver that Toasts 警报工作了 我正在尝试设置重复PendingIntent引起AlarmReceiver5 45 和 17 30 但在启动应用程序几
  • grails:如何更改编译的 GSP(gsp*.class 文件)?

    我在 weblogic 中使用 grails 需要更改展开的部署文件夹中的类文件 但这个类实际上是一个gsp编译的文件 那么 问题是 GSP 文件 class 在战争中留在哪里 注意 我正在使用外部 GSP 设置grails gsp vie
  • Google 图表 API JSON 无效

    以下代码返回 Google 图表的 json public static DataTable generateDataTable Create a data table DataTable data new DataTable ArrayL
  • 使用本地化日期进行 Django 查询

    在我的表单中 我有一个名为 booking date 的 DateField 它是使用 AdminDateWidget 呈现的 booking date字段的内容需要国际化 当我想像这样使用字段的值时 就会出现问题 booking Book
  • 访问或获取静态类中的 Autofac Container

    我需要在静态类中获取或访问我的 IoC 容器 这是我的 简化的 场景 我在 Startup 类中注册 ASP net Web Api 的依赖项 而且我也为 MVC 或 WCF 执行此操作 我有一个 DependecyResolver 项目
  • 如何从可变大小的字符串中获取所需的字符?

    我需要提取附加到该单词的所需字符串 例如 pot 1 Sam pot 22 Daniel pot 444 Jack pot 5434 Bill 我需要从上面的字符串中获取名称 即萨姆 丹尼尔 杰克和比尔 问题是 如果我使用子字符串 由于数字
  • git ls-带日期的文件?

    在 GitHub 上 每个文件夹页面上都有这个很好的功能 它列出了文件名以及上次提交该文件的时间 这类似于ls l命令 有没有办法从命令行模仿这种行为 就像是 git ls files l 基于sjas 回答 https stackover
  • mySQL 专家 - 需要“相交”方面的帮助

    我知道 mySQL 5 x 不支持 INTERSECT 但这似乎正是我所需要的 表 A 产品 p id 表 B Prod cats cat id 类别信息 名称 描述等 表 C prod 2cats p id cat id 多对多 prod
  • Android:将父状态传播到子视图

    我遇到了一些我基本上不知道如何解决的问题 我有一个 LinearLayout 里面有一些子组件 如 ImageView TextView 等 可以在下面的 xml 中看到一个示例
  • 为什么我的页眉周围有空白且没有颜色?

    我试图填满整个
  • bash 命令输出作为参数

    假设命令alpha产生这个输出 a b c d 如果我运行命令 beta alpha then beta将使用四个参数执行 a b c and d 但是如果我运行命令 beta alpha then beta将使用一个参数执行 a b c
  • UIWebView 和 Safari 比较

    UIWebView 是否使用与 Mobile Safari 相同的 JavaScript 引擎 另外 UIWebView 是否像 Mobile Safari 一样支持所有 HTML5 功能 我特别关心 Web SQL 和 Web Worke
  • Android 短划线/虚线问题?

    当我使用时Android 虚线 its 在小屏幕上运行良好 but 不适用于 Samsung S3 设备及更高版本 截图 And 可绘制 dashline xml
  • 如何在 VSTS 中使用 NUnit?

    我正在尝试在 Visual Studio Team System 中使用 NUnit 3 但他们似乎让这变得非常困难 我已在构建过程和高级执行选项中添加了测试程序集步骤 gt 自定义测试适配器的路径 我已按照帮助中的建议放入 NUnitVi
  • 检查列表是否为空(Raku)

    常见问题解答 在 Raku 中如何检查列表是否为空 还有比以下更惯用的方法吗 my l say l elems 0 say l say l Bool The 名单上的文档 https docs perl6 org type List推荐智能