如何在导入模块时为导出的sub设置命名参数默认值?
Raku模块导入时动态设置子例程参数默认值的实现
要实现通过use语句标记指定show子例程:$indent参数的默认值,我们可以利用Raku的EXPORT块处理导入逻辑,根据传入的标记动态生成带定制默认值的子例程。
修改后的模块代码
unit module My::Show; sub EXPORT(*@tags) { # 初始化默认缩进状态为False,对应use My::Show;的情况 my $default-indent = False; # 解析导入标记 for @tags -> $tag { when ':indent' { $default-indent = True } when ':!indent' { $default-indent = False } # 可选:处理未知标记,取消注释启用 # default { die "未知导入标记: $tag" } } # 创建带定制默认值的show子例程 my &show = sub (:$indent = $default-indent) { say $indent ?? " Showing with indentation." !! "Showing without indentation."; }; # 返回要导出的符号映射 { show => &show } }
代码说明
- EXPORT块的作用:Raku模块的
EXPORT块会接收use语句中传入的所有标记(如:indent),并返回需要导出的符号。我们可以在这里根据标记动态调整子例程的默认行为。 - 标记解析:遍历传入的标记,根据
:indent或:!indent设置默认的缩进状态。如果没有传入标记,则保持默认的False。 - 定制子例程:创建匿名子例程
&show,其:$indent参数的默认值使用解析得到的$default-indent,确保不同导入场景下的默认行为符合预期。
使用示例
- 默认导入:
use My::Show; show(); # 输出: Showing without indentation. show(:indent); # 输出: Showing with indentation. - 开启默认缩进:
use My::Show :indent; show(); # 输出: Showing with indentation. show(:!indent); # 输出: Showing without indentation. - 显式关闭默认缩进:
use My::Show :!indent; show(); # 输出: Showing without indentation.
额外说明
如果需要严格校验导入标记,可以在for循环中添加default分支抛出异常,避免未知标记被忽略。这种实现方式保证了每个导入作用域中的show子例程都有独立的默认参数值,不同模块导入不会互相干扰。
内容的提问来源于stack exchange,提问作者Jim Bollinger
相关产品推荐
相关产品推荐

