考虑这个程序,我在参数列表中构造了一个数组。尽管有一个接受数组的签名,但这调用了接受列表的签名:
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 )
版本?调度员如何做出决定(以及记录在哪里)?
为什么它不调用 ( Array @array ) 版本?
你的测试foo
调用只有一个数组([1,2,3]
) 作为其参数,而不是数组of Array
s (eg [[1,2,3],[4,5,6]]
).
(The @
in @array
表示一个值does Positional
,例如数组或列表。Array @array
表示相同的事物,但有附加的约束,即数组、列表或其他任何元素的每个元素都是一个Array
.)
调度员如何做出决定?
简单来说,它选择最窄的匹配类型:
multi foo ( Array ) {} # Narrowest
multi foo ( List ) {} # Broader
multi foo ( Positional ) {} # Broader still
multi foo ( @array ) {} # Same as `Positional`
(子类型关系图Array, List and Positional https://docs.perl6.org/images/type-graph-Array.svg.)
有关大量详细信息,请参阅jnthn对相关SO问题的权威回答 https://stackoverflow.com/a/45123753/1077672.
(以及它记录在哪里)?
我不确定医生的情况。多次调度 https://docs.perl6.org/language/functions#Multi-dispatch看起来非常小。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)