如何在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
相关产品推荐
相关产品推荐

