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

如何在导入模块时为导出的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 }
}

代码说明

  1. EXPORT块的作用:Raku模块的EXPORT块会接收use语句中传入的所有标记(如:indent),并返回需要导出的符号。我们可以在这里根据标记动态调整子例程的默认行为。
  2. 标记解析:遍历传入的标记,根据:indent或:!indent设置默认的缩进状态。如果没有传入标记,则保持默认的False。
  3. 定制子例程:创建匿名子例程&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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 12:22:35