鸭子打字和通用编程

2020年11月28日 18点热度 0条评论

我在SO上搜索了一段时间,但找不到一个明确而笼统的答案,只有一些矛盾和特殊的意见。 [1]

所以我想知道鸭子类型和通用编程之间的关系是什么? (DT GP)。通过泛型编程,我特别指的是C++模板或Java泛型,但是如果可能的话,也欢迎与这些概念相关的一般性答案。

我知道泛型编程将在编译时处理,而鸭子类型将在运行时处理,但是我不知道如何放置它们。

最后,我不想开始辩论,所以我希望回答诸如理由,反对之类的答案。

[1] What's the relationship between C++ template and duck typing?

解决方案如下:

我遇到了“鸭子打字”的两个不同定义。毫无疑问,有些人会告诉您,其中一个是“正确”,另一个是“不正确”。我只是试图证明它们都被使用了,而不是告诉您它们都是“正确的”,但就我个人而言,更广泛的含义没有错。

1)仅运行时键入。类型是对象的属性,而不是变量,因此,当您要在对象上调用方法或以其他方式使用其类型所具有的属性时,类型必定是在运行时发现该方法的有无[*] ]。因此,如果“看起来像鸭子,而像鸭子一样是鹌鹑”(即,如果它具有quack()函数),那么它就是“鸭子”(无论如何,您都可以像对待鸭子一样对待它)。通过这种定义,C++模板当然首先会遇到障碍,它们使用静态类型。

2)更普遍地使用这样的名称,即如果它看起来像鸭子,而象鸭子一样嘎嘎叫,那么它就是鸭子,这是指其中接口(interface)由接口(interface)的使用者执行的操作隐式定义的任何设置,而不是而不是生产者显式通告的接口(interface)(无论采用哪种接口(interface))。通过这个定义,C++模板确实使用了一种鸭子式输入,但是“看起来像鸭子”是在编译时而不是在运行时根据其静态类型而不是动态类型确定的。 “在编译时检查,此变量的静态类型可以发出声音吗?”,而不是“在运行时检查,此对象可以发出声音吗?”。

在我看来,争论实际上是关于Python是否“拥有”该术语,以便只能将类似Python的类型系统称为“鸭子类型”,还是其他人是否可以随意使用该术语以在不同的上下文中表示相似的概念。 。无论您认为这意味着什么,使用“开 Jest ”一词并要求每个人都从中理解相同的正式定义似乎是不负责任的。因此,SO是一个不适合告诉您“应该”一词含义的论坛,除非您要问的是权威来源,例如字典或任何正式定义它的学术论文。我认为它可以告诉您它实际上是什么意思。

“通用编程”可以使用或不使用鸭子输入,具体取决于确切的细节。 C++通用容器确实使用“类型2”鸭式输入,因为对于C++中的通用类型,不能保证您可以复制,比较它,获取哈希值等。Java通用容器不这样做,Object有足够的方法已经使其可散列等。

相反,我怀疑您使用鸭子类型进行的任何操作都可以合理地称为“通用编程”。因此,我想,按照您所要求的术语,鸭子类型(任一个定义)中的GP> DT是可以被称为“泛型”的大量事物的严格子集。

[*]好吧,在某些情况下,您的动态语言可能会进行某种静态分析,从而以一种或另一种方式证明了这种情况,但是对于静态分析无法得出结论的情况,该语言要求能够将此检查推迟到运行时。