加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

签名 – Perl 6的多调度如何决定使用哪种例程?

发布时间:2020-12-16 06:23:43 所属栏目:大数据 来源:网络整理
导读:考虑一下我在参数列表中构造一个Array的程序.虽然有一个接受数组的签名,但这会调用接受List的签名: foo( [ 1,2,3 ] );multi foo ( Array @array ) { put "Called Array @ version" }multi foo ( Array $array ) { put "Called Array $version" }multi foo
考虑一下我在参数列表中构造一个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看起来很小.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读