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

Making exported functions in submodules accessible in global namespace in Raku

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

new
│   .gitignore
│   Changes
│   dist.ini
│   LICENSE
│   META6.json
│   README.md
│
├───lib
│   │   new.rakumod
│   │
│   ├───Desc
│   │       Mean.rakumod
│   │
│   └───Deviation
│           DeviationMean.rakumod
│
└───t
        01-basic.rakutest

我有两个函数,Desc::Mean.rakumod 中的 meanlibDeviation::DeviationMean.rakumod 模块中的 deviation_from_mean。 这些都是简单的函数,我不想为它们定义任何命名空间。因此,当我安装此模块并尝试将此模块与 use new 一起使用时,我希望能够在不调用其子模块名称的情况下访问这两个函数。

我想做的是(现在不行)

use new;

my @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];
say mean(@test1);
say deviation_from_mean(@test1);

而不是(有效)

use new;
use Desc::Mean;
use Deviation::DeviationMean;

my @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];
say mean(@test1);
say deviation_from_mean(@test1);

有办法吗?

粗略地说,在 docs 之后,您可以像这样(在 new.rakumod 中)将这些方法名称作为导出项放入 new 命名空间中:

my package EXPORT::DEFAULT {
    OUR::mean := "Desc::Mean::mean";
    OUR::deviation_from_mean :=
         "Deviation::DeviationMean::deviation_from_mean";
}
# 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;

备注:

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

  • use 根据需要在 EXPORTimport 那些模块的符号中添加更多模块(例如 Deviation::DeviationMean)进入 new compunit;然后 return ::.pairs.grep(*.key ne '$_').Map;re-export 将它们的所有符号转换为任何 uses new.

有关上述内容的解释,请参阅:

  • .

  • 导入符号到一个包中,然后然后re-exporting 他们" .

    部分