callwith与samewith的预期功能是什么?关于callwith的使用疑惑
关于Perl 6中
callwith和samewith的功能解析及你的MAIN问题解答 我来帮你理清这两个函数的预期功能,还有你遇到的MAIN子例程的困惑——这俩的行为和你最初的理解有个关键差异,咱们一步步拆解:
一、callwith的核心作用
它是专门为multi多候选子例程设计的,核心逻辑是:
- 调用当前正在执行的候选子例程之后定义的、第一个能匹配你传入参数的候选子例程
- 直接返回那个候选子例程的返回值
划重点:它不是“随便找一个同名的匹配候选”,而是严格按照子例程的定义顺序,只在当前候选之后的候选里找第一个匹配项。你传入的参数会用来匹配后续候选的签名,这一点和你想的一致,但“定义顺序”是你之前忽略的关键。
二、samewith的核心作用
和callwith是同系列的工具,但它的行为有个明显区别:
- 它不会使用你手动传入的新参数,而是复用当前子例程被调用时收到的原始参数,去匹配当前候选之后的下一个匹配候选。
- 举个简单例子:如果你的multi子例程被传入
1, 2,调用samewith就相当于自动把1, 2传给下一个匹配的候选,不用你再手动写参数。
三、你的MAIN子例程问题原因
你说在双参数MAIN($a,$b)里调用callwith("$a$b")没触发单参数MAIN($x),问题出在候选的定义顺序上:
假设你的代码是这样的:
# 先定义单参数MAIN multi MAIN($x) { say "Single argument received: $x"; } # 后定义双参数MAIN multi MAIN($a, $b) { my $combined = "$a$b"; callwith($combined); # 这里找不到前面的单参数MAIN }
因为callwith只会搜索当前候选之后定义的候选,而单参数MAIN是在双参数MAIN之前写的,所以不在它的搜索范围内,自然不会被调用。
如果调整一下定义顺序,把双参数MAIN放在前面:
multi MAIN($a, $b) { my $combined = "$a$b"; callwith($combined); # 现在能找到后面的单参数MAIN } multi MAIN($x) { say "Single argument received: $x"; }
这时你运行脚本传入两个参数(比如perl6 your-script.pm foo bar),callwith就会成功调用后面的单参数MAIN,输出Single argument received: foobar。
另外补充一点:MAIN是Perl 6的特殊multi子例程,它的候选匹配原本是基于命令行参数的,但callwith的逻辑和普通multi子例程完全一致,只认定义顺序和参数匹配。
内容的提问来源于stack exchange,提问作者Christopher Bottoms
相关产品推荐
相关产品推荐

