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

如何在Raku的given代码块中用when对值列表进行智能匹配?

问题:用Raku的given/when智能匹配列表值重构代码

原JavaScript代码

function append(demo = "", file = "") {
    const extra = "ctl=1&embed=1";
    if (demo && file)  return `/${demo}/?file=${file}&${extra}`;
    if (!demo && file) return `/?file=${file}&${extra}`;
    if (demo && !file) return `/${demo}&${extra}`;
    return `?${extra}`; 
}

可用但重复度高的Raku实现

可以轻松用if语句将代码移植到Raku,但想利用given/when特性实现,写出了如下代码:

sub append(Str :$demo, Str :$file) {
    my $extra = "ctl=1&embed=1";
    given ($demo, $file) {
        when $demo.so,  $file.so  { "/$demo/?file=$file&$extra" } 
        when $demo.not, $file.so  { "/?file=$file&$extra" } 
        when $demo.so,  $file.not { "/$demo?$extra" } 
        default                   { "?$extra" }
    }
}

say append :file("here"), :demo("there"); # /there/?file=here&ctl=1&embed=1
say append :file("here");                 # /?file=here&ctl=1&embed=1
say append :demo("here");                 # /here?ctl=1&embed=1
say append;                               # ?ctl=1&embed=1

这段代码能正常运行,但重复度较高,不确定是否符合Raku的惯用写法。

尝试优化但未达预期的写法

于是尝试了下面的写法,却没有达到预期效果:

sub append(Str :$demo = '', Str :$file = '') {
    my $extra = "ctl=1&embed=1";
    given ($demo.so, $file.so) {
        when (True,  True)  { "/$demo/?file=$file&$extra" } 
        when (False, True)  { "/?file=$file&$extra" } 
        when (True,  False) { "/$demo?$extra" } 
        default             { "?$extra" }
    }
}

疑问

是否可以将值列表绑定到主题变量$_,并使用when对其进行智能匹配?我隐约记得Daniel "codesections" Sockwell做过类似操作,但记不清具体细节了。


内容的提问来源于stack exchange,提问作者uzluisf

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 03:30:23