考虑一下我在参数列表中构造一个Array的程序.虽然有一个接受数组的签名,但这会调用接受List的签名:
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)版本?调度员如何做出决定(以及记录在哪里)?
解决方法
Why doesn’t it call the ( Array @array ) version?
你的测试foo调用只有一个数组([1,3])作为它的参数,而不是一个数组数组(例如[[1,3],[4,5,6]]).
(@array中的@表示执行Positional的值,例如数组或列表.数组@array表示相同的内容,但附加约束条件是数组,列表或其他任何元素都是数组.)
How is the dispatcher making its decision?
简化,它选择最窄的匹配类型:
multi foo ( Array ) {} # Narrowest multi foo ( List ) {} # Broader multi foo ( Positional ) {} # Broader still multi foo ( @array ) {} # Same as `Positional`
(Diagram of subtype relationships of Array
,List
and Positional
.)
有关详细信息,请参阅jnthn’s authoritative answer to a related SO question.
(and where is it documented)?
我不确定这个文件. Multi-dispatch看起来很小.