使子模块中的导出函数可以在 Raku 的全局命名空间中访问

Sum*_*nal 7 module function rakudo raku

我创建了一个名为 的最小工作模块new。文件夹结构,链接如下:

\n
new\n\xe2\x94\x82   .gitignore\n\xe2\x94\x82   Changes\n\xe2\x94\x82   dist.ini\n\xe2\x94\x82   LICENSE\n\xe2\x94\x82   META6.json\n\xe2\x94\x82   README.md\n\xe2\x94\x82\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80lib\n\xe2\x94\x82   \xe2\x94\x82   new.rakumod\n\xe2\x94\x82   \xe2\x94\x82\n\xe2\x94\x82   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80Desc\n\xe2\x94\x82   \xe2\x94\x82       Mean.rakumod\n\xe2\x94\x82   \xe2\x94\x82\n\xe2\x94\x82   \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80Deviation\n\xe2\x94\x82           DeviationMean.rakumod\n\xe2\x94\x82\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80t\n        01-basic.rakutest\n
Run Code Online (Sandbox Code Playgroud)\n

我有两个函数,meanDesc::Mean.rakumod和模块中deviation_from_mean。\n这些是简单的函数,我不想为它们定义任何命名空间。因此,当我安装此模块并尝试将此模块与 一起使用时,我希望能够访问这两个函数而不调用它们的子模块名称。Deviation::DeviationMean.rakumodlibuse new

\n

我想做的是(现在不起作用)

\n
use new;\n\nmy @test1 = [6,6,4,6,8,6,8,4,4,6,6,8,8,8,8,8,8,4,4,4,4,8,8,8,8,4,4,4,8,6,8,4];\nsay mean(@test1);\nsay deviation_from_mean(@test1);\n
Run Code Online (Sandbox Code Playgroud)\n

而不是(有效)

\n
use new;\nuse Desc::Mean;\nuse Deviation::DeviationMean;\n\nmy @test1 = [6,6,4,6,8,6,8,4,4,6,6,8,8,8,8,8,8,4,4,4,4,8,8,8,8,4,4,4,8,6,8,4];\nsay mean(@test1);\nsay deviation_from_mean(@test1);\n
Run Code Online (Sandbox Code Playgroud)\n

有没有办法做到这一点?

\n

p6s*_*eve 5

粗略地说,按照文档,您可以将这些方法名称作为导出放入new命名空间中,如下所示(在 new.rakumod 中):

my package EXPORT::DEFAULT {
    OUR::mean := "Desc::Mean::mean";
    OUR::deviation_from_mean :=
         "Deviation::DeviationMean::deviation_from_mean";
}
Run Code Online (Sandbox Code Playgroud)


rai*_*iph 1

# main.raku
use lib 'lib';
use new;
say mean; # 42

# Desc::Mean
unit module Desc::Mean;
sub mean is export { 42 }

# new
sub EXPORT {
  {
    use Desc::Mean;
    return ::.pairs.grep(*.key ne '$_').Map;
  }
}
unit module new;
Run Code Online (Sandbox Code Playgroud)

笔记:

  • sub EXPORT { ... }模块中的必须new位于语句之前unit module new;

  • useDeviation::DeviationMean根据需要在子中添加其他模块(例如) EXPORT,以将这些模块的符号导入new到计算机中;return ::.pairs.grep(*.key ne '$_').Map;然后,将把所有符号重新导出use到任何s new

对于上述内容的解释请参见: