gpt4 book ai didi

raku - 使用模块加载一组相关函数

转载 作者:行者123 更新时间:2023-12-02 06:46:59 26 4
gpt4 key购买 nike

我想使用Raku Modules来分组一些我经常使用的功能。因为这些函数都是松散耦合的,所以我不喜欢将它们添加到类中。

我喜欢 use 的想法,您可以在其中选择应该导入哪些函数,但我不喜欢它,导入的函数然后存储在全局命名空间中.

例如,如果我有一个文件 my_util.pm6:

#content of my_util.pm6
unit module my_util;
our sub greet($who) is export(:greet) {
say $who;
}
sub greet2($who) is export(:greet2) {
say $who;
}
sub greet3($who) is export(:greet3) {
say $who;
}

和一个文件test.p6:

#!/usr/bin/perl6
#content of test.p6
use v6.c;
use lib '.';
use my_util :greet2;

greet("Bob"); #should not work (because no namespace given) and also doesn't work
greet2("Bob"); #should not work (because no namespace given) but actually works
greet3("Bob"); #should not work (because no namespace given) and also doesn't work
my_util::greet("Alice"); #works, but should not work (because it is not imported)
my_util::greet2("Alice"); #should work, but doesn't work
my_util::greet3("Alice"); #should not work (because it is not imported) and also doesn't work

我想通过 my_util::greet() 而不仅仅是通过 greet() 调用所有函数。

my_util.pm6 中定义的函数 greet() 非常接近我的要求,但因为它被定义为 our,所以它总是被导入。我喜欢的是选择应导入哪些函数的可能性,并且应该可以将其保留在模块定义的命名空间中(即,它不会污染全局命名空间)

有谁知道我怎样才能实现这个目标?

最佳答案

为了消除一些潜在的困惑......

词法范围和包符号表是不同的东西。

  1. my将符号添加到当前词法范围

  2. our将符号添加到当前词法范围添加到当前包的公共(public)符号表

  3. use将请求的符号复制到当前词法范围中。
    这就是所谓的“导入”。

  4. :: 分隔符执行包查找 - 即 foo::greet 中查找符号 greet >包foo的公共(public)符号表
    这不涉及任何“导入”。

至于你想要实现什么......

无论从何处引用,包的公共(public)符号表都是相同的...没有机制可以使包中的各个符号在不同范围内可见。

可以将冒号作为子例程实际名称的一部分...

sub foo::greet($who) is export(:greet) { say "Hello, $who!" }
# This subroutine is now literally called "foo::greet".

...但是你不能再以正常的方式调用它(因为解析器会将其解释为上面的规则 4),所以你必须使用笨重的“间接词法查找”语法,这显然是不是你想要的:

foo::greet "Sam";          # Could not find symbol '&greet'
::<&foo::greet>( "Sam" ); # Hello, Sam!

所以,你最好的选择是......

  • 使用 our 声明子例程,并接受这样一个事实:所有子例程都可以从使用模块的所有作用域访问。
    或者:
  • 将公共(public)前缀直接添加到子例程名称中,但使用无问题的分隔符(例如破折号),然后正常导入它们:
unit module foo;
sub foo-greet($who) is export(:greet) { ... }
sub foo-greet2($who) is export(:greet2) { ... }
sub foo-greet3($who) is export(:greet3) { ... }

关于raku - 使用模块加载一组相关函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45770133/

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