维基百科曾经说过*关于鸭子打字:
在使用面向对象编程语言的计算机编程中,鸭子类型是一种动态类型,其中对象的当前方法和属性集确定有效语义,而不是从特定类或特定接口的实现继承。
(* 编者注:自发布此问题以来,维基百科文章已被编辑以删除“动态”一词。)
它说的是结构类型:
结构类型系统(或基于属性的类型系统)是类型系统的主要类,其中类型兼容性和等价性由类型的结构决定,而不是通过显式声明。
它将结构子类型与鸭子类型进行对比:
[结构系统] 与 ... 鸭子类型形成对比,其中只检查在运行时访问的结构部分的兼容性。
然而,在我看来, duck-typing一词至少直观地包含了结构子类型系统。事实上维基百科说:
概念的名称 [duck-typing] 指的是鸭子测试,归因于 James Whitcomb Riley,它可以表述如下:“当我看到一只鸟儿像鸭子一样走路、像鸭子一样游泳、像鸭子一样嘎嘎叫时,我称那只鸟为鸭子。”
所以我的问题是:为什么我不能将结构子类型称为鸭子类型?是否甚至存在不能被归类为鸭子类型的动态类型语言?
后记:
正如 reddit.com 上一个叫daydreamdrunk的人如此雄辩地说: “如果它像鸭子一样编译并像鸭子一样链接......”
后记
许多答案似乎基本上只是重复我在这里已经引用的内容,而没有解决更深层次的问题,这就是为什么不使用术语鸭子类型来涵盖动态类型和结构子类型?如果您只想谈论鸭子类型而不是结构子类型,那么就称它为:动态成员查找。我的问题是,鸭子打字这个词对我没有任何意义,这只适用于动态语言。