You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否在运行时向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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 22:22:47