我遇到过两种不同的"鸭子打字"定义.毫无疑问,有人会告诉你,其中一个是"正确的"而另一个是"不正确的".我只是试图记录它们都被使用而不是告诉你它们都是"正确的",但我个人认为更广泛的含义并没有错.
1)仅运行时键入.Type是对象的属性,而不是变量,因此当您在对象上调用方法或者根据其类型使用它具有的属性时,必然会在运行时发现该方法的存在与否[*].因此,如果它"看起来像一只鸭子并且像鸭子一样呱呱叫"(即如果它有一个quack()
功能)那么它"是"一只鸭子(无论如何,你可以像对待它一样).通过这个定义当然C++模板处于第一个障碍,他们使用静态类型.
2)一个名称更常用于以下原则:如果它看起来像鸭子和呱呱叫鸭子那么它就是一个鸭子,意味着任何设置,其中接口由接口的消费者执行的操作隐式定义,而不是比生产者明确宣传的接口(无论实现接口).通过这个定义,C++模板确实使用了一种鸭子类型,但是在"编译时",而不是在运行时,根据其静态类型而不是动态类型确定"看起来像鸭子"的东西."在编译时检查,这个变量的静态类型可以嘎嘎吗?",而不是"在运行时检查,这个对象可以嘎嘎叫吗?".
实际上,我认为争议是Python"拥有"这个术语,因此只有类似Python的类型系统可以被称为鸭子类型,或者其他人是否可以自由地将该术语理解为在不同的上下文中表示类似的概念.无论你认为它应该是什么意思,使用"jokey"术语并要求每个人都理解同样的正式定义似乎是不负责任的.SO不是一个合适的论坛,可以告诉你一个术语"应该"是什么意思,除非有你要求的权威来源,比如字典或任何正式定义它的学术论文.我认为它可以告诉你它实际上意味着什么.
"通用编程"可以使用或不使用鸭子打字,具体取决于具体细节.C++通用容器确实使用"类型2"鸭子类型,因为对于C++中的一般类型,不保证您可以复制它,比较它,获取哈希值等等.Java通用容器没有,Object
已经有足够的方法使它可以清洗等
相反,我怀疑你做的任何使用鸭子打字的东西都可以合理地称为"通用编程".所以我想,在你要求的术语中,GP> DT中的鸭子打字(任一定义)是可以称为"通用"的大量内容的严格子集.
[*]好吧,在某些情况下,你的动态语言可能会有一些静态分析,可以用这种方式证明这种情况,但语言要求能够将这种检查推迟到运行时,以防静态分析无法确切地说.
这实际上是一个词汇问题.在最普遍的意义上,泛型编程与编译时与运行时的问题无关:它是一个普遍问题的解决方案.通用编程是运行时的一个很好的例子是Python,但是也可以用C++实现运行时泛型编程(执行时间成本很高).
Duck typing是一个正交概念,通常用于暗示运行时输入.同样,最常被引用的现代示例是Python,但是从Lisp开始的许多语言过去都使用过它.作为一般规则,C++和Java都明确选择不支持duck typing.这是一个权衡:安全性与灵活性(或编译时错误与运行时错误).
归档时间: |
|
查看次数: |
1369 次 |
最近记录: |