gpt4 book ai didi

raku - 执行包函数的意外输出

转载 作者:行者123 更新时间:2023-12-03 14:06:52 25 4
gpt4 key购买 nike

我有以下目录结构(重现问题的简化版本):

testing/
lib/
CLI.pm6
t/
01-test.t
可以查看来源 here .问题是如果你运行 raku -Ilib t/01-test.t您将获得以下输出:
    ok 1 - show help message
1..1
ok 1 - no arguments provided
not ok 1 - long version
# Failed test 'long version'
# at site#sources\D2E3739A3B53AD1F7CFEE6DA262613FD174A0BC9 (Test::Output) line 84
# expected a match with: /Documentable\sversion/
# got: "version\r\n"
1..1
# You failed 1 test of 1
not ok 2 - version command
# Failed test 'version command'
# at t\01-test.t line 12
1..2
# You failed 1 test of 2
Execute "documentable --help" for more information.
一切看起来都很正常(显然测试失败了)。问题是最后一行:
Execute "documentable --help" for more information.
该行由 CLI::MAIN() 添加,但在测试完成后不执行。您甚至可以评论第一个子测试 block ,它仍然会出现。这导致使用 prove6 -l 的测试执行失败。 .知道发生了什么吗?

最佳答案

更改use CLI;use CLI {} .
问题
假设 CLI找到包,运行这个:

use CLI;
将显示:
Execute "documentable --help" for more information.

Unexpected output


以上显然不是您想要的,但您的测试代码不会改变 CLI 的方式。包是 use d。所以应该预料到不需要的消息,因为它是 MAIN 功能按预期工作。 [1]
一个办法
您的问题归结为:

How do I use a package with exported MAINs while suppressing the automatic running of those MAINs?


一种简单的解决方案是不导入 MAIN (或者更确切地说 &MAIN [2] 。)
一种方法是替换 use CLI;use CLI {} .
一个 use CLI;语句等效于 use CLI :DEFAULT; . ( :DEFAULT tag 会拾取所有带有 is export 且没有其他标签的东西。)
如果你写 use CLI {}相反,除了 CLI 之外,不会导入任何符号本身,它将绑定(bind)到 CLI 的符号以包装合格的形式导出。
这样,您可以手动测试 MAIN (指定包 -- CLI::MAIN )将继续工作,但它的自动调用将被禁止。
脚注
[1] 如果文档没有说明清楚:
  • is exportour proto MAIN CLI 中的声明包导出 &MAIN [2] symbol ;
  • use声明导入 &MAIN符号到 t/01-test.t的词法范围;
  • 命令raku ... t/01-test.t调用 t/01-test.t没有参数,prove6 -l ... 也是如此(假设没有超出 lib 的其他参数传递给主线)。所以零参数&MAIN调用调用;
  • 零参数调用解析为零参数 multi MAIN() { note 'Execute ... information'; }宣言。所以你看到了它的信息。

  • [2] MAIN 这样的子声明声明一个符号 &MAIN . (像 MAIN blah blah 这样的子调用调用与 &MAIN 关联的例程。)

    关于raku - 执行包函数的意外输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62572587/

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