能否在运行时向Raku模块添加子例程?求实现方法
在Raku运行时向模块动态添加子例程
你提出的需求完全可以实现,以下是具体的实现细节:
Perl中的实现方式
你在Perl里会通过类型glob来动态添加子例程:
*{'My::Module::foo'} = \sub { 'FOO!' };
Raku中的正确实现
Raku确实没有Perl的类型glob机制,但借助MONKEY-TYPING pragma可以修改模块的元类,从而动态添加子例程。你设想的思路是对的,不过需要调整两处细节:
- 将
use MONKEY改为use MONKEY-TYPING(这是Raku中用于开启动态类型修改的正确pragma) - 使用元类的
add_method方法而非add-sub(Raku元类提供的标准方法是add_method)
完整代码示例:
use MONKEY-TYPING; module Foo {}; # 向Foo模块添加名为foo的子例程 Foo.^add_method('foo', sub { 'FOO!' }); # 调用新增的子例程,两种方式都可行 say Foo::foo(); # 输出: FOO! say Foo.foo(); # 输出: FOO!
注意事项
MONKEY-TYPING会关闭Raku的部分安全检查,允许动态修改已声明的类型,建议仅在必要场景使用- 模块在Raku中属于类型的一种,因此可以通过元类方法来修改其成员
内容的提问来源于stack exchange,提问作者Rawley Fowler
相关产品推荐
相关产品推荐

