考虑这个程序,我在参数列表中构造一个数组。虽然有这么接受一个数组的签名,这个调用接受列表中的一个:Perl 6的多派遣如何决定使用哪个例程?
foo([ 1, 2, 3 ]);
multi foo (Array @array) { put "Called Array @ version" }
multi foo (Array $array) { put "Called Array \$ version" }
multi foo (List $list) { put "Called List version" }
multi foo (Range $range) { put "Called Range version" }
我得到的输出从一个意想不到的例行:
Called Array $ version
如果我取消,其他签名,那一个被称为:
Called List version
为什么它不叫(Array @array)
版本?调度员如何做出决定(以及它在哪里记录)?
cf'say( - > Array @ {})。signature.params [0]。输入' – Christoph
@briandfoy我已经删除了关于逆转(减少噪音)的评论。随意删除您的确认评论。稍后我会删除这一个。 :) – raiph
briandfoy您还没有接受答案。我愿意加倍努力。我想我完全解决了“为什么不叫...?”。我想我完全解决了“调度员如何做出决定?”因为它与你的具体例子有关。我认为@斯莱德的回答更广泛地解决了这个问题。但你写道:“这并不能解释我所表现出的行为。”根据我对他们的回答的评论,我认为它的确如此。我可以扩大我的答案,“它在哪里记录?”通过链接到对应斯莱德的答案的文档。我很感谢你的指导。 :) – raiph