如何使用require循环遍历Plugin类并调用其enable方法?
正确实现方式
你的核心问题是混淆了模块加载语法和类符号查找的用法,以下是修正后的代码:
unit class Top; has $!rdp; submethod TWEAK { my $rdp := self.rdp; for <A B C> -> $plugin { # 构建模块/类的完整名称 my $class-name = "Plugin::$plugin"; # 动态加载对应模块 require ::($class-name); # 获取类对象、实例化并调用enable方法 ::($class-name).new.enable($rdp); } }
关键修正点:
- 用
::($class-name)作为require的参数:Raku中require可以接受符号表中的模块名称,通过字符串插值构建完整模块名后,用::()解析为模块引用完成加载。 - 统一类名的构建逻辑:将
Plugin::与循环变量拼接,确保模块名和类名的一致性(假设你的插件模块中定义了同名类)。
如果你的插件文件路径和命名空间严格对应(比如Plugin/A.rakumod对应Plugin::A类),上述代码就能正常工作。
另外,也可以用use-ok替代require,效果类似(都是运行时加载模块):
for <A B C> -> $plugin { my $class-name = "Plugin::$plugin"; use-ok $class-name; ::($class-name).new.enable($rdp); }
内容的提问来源于stack exchange,提问作者Richard Hainsworth
相关产品推荐
相关产品推荐

