维基百科的采用的说*约 鸭子-打字:

在计算机编程 面向对象编程语言, 鸭打字是一种风格的动态 打中这一个目的前 设定的方法和属性 确定有效的语义,而不是 比其继承一个特别的 类或执行特定的 接口。

(*埃德。注:由于这个问题发布,该文章已被编辑删除该词,"动态"。)

它说关于 结构类型:

一个结构类型系统(或 基于属性的类型系统)是主要的 类型的系统,在这种类型 兼容性和等同性都是 决定通过该类型的结构, 而不是通过明确的声明。

它的对比结构型与鸭子-打字为这样:

[结构系统]对比 ...鸭子输入,其中只有 该结构的一部分访问 运行时是否兼容性。

但是,术语 鸭子-打字 在我看来,至少直观地包含的结构性子输入系统。事实上,维基百科的说:

名称的概念[鸭子-打字] 指 鸭子测试, ,归因于 詹姆斯*惠特科姆莱利这可以措辞如 下:"当我看到一只鸟走 像鸭子和游泳像一只鸭子, 江湖医生就像一只鸭子,我管这叫鸟 鸭子"。

所以我的问题是:为什么我不能呼叫结构型鸭子-打字?在那里做甚至存在的动态类型的语言,它不可能也被分类为是鸭子类型的?

后记:

作为一个人名 daydreamdrunk 上reddit.com 所以 雄辩地把它 "如果编译像鸭子和链接的像只鸭子..."

后postscript

许多答案似乎是基本上只是重复我已引述这里,而不解决更深层次的问题,这就是为什么没有使用该术语的鸭子-打字掩盖这两种动态的打字和结构的子打字?如果你只想谈谈鸭子-打字和不结构的子输入,那么就叫什么,它是: 动态部件的查找.我的问题是,没有关于该术语 鸭子-打字 对我说,这只适用于动态的语言。

有帮助吗?

解决方案

C++和D的模板是一个完美的例子鸭子输入,不是动态的。它肯定是:

打中这一个 对象是当前的一套方法和 属性确定的有效期 语义,而不是其继承 从某一特定类别或 执行情况的一个具体 接口。

你没有明确指定一个接口,你的类型必须继承化的模板。它只是需要的所有功能,内部使用的模板的定义。但是,一切得到解决在编制时间,并编制下原,高深莫测的进制数字。我管这叫"编译时间鸭打字"。我写了整个图书馆从这种心态,隐含的模板的实例是编纂时只鸭子输入,并认为这是一个最受赞赏的特征。

其他提示

结构种类型的系统

一个结构类型系统进行比较的一整类型整个种类型,以确定它们是否相容的。对于两种类型 AB 是兼容的, AB 必须有相同的结构–就是 方法上的 A 和上 B 必须有相同的签名。

鸭打字

鸭打字认为两个类型是同等的 对于手头的任务 如果他们既可以处理这项任务。对于两种类型 AB 相当于一块代码,希望编写文件, AB 两者都必须实行编写的方法。

摘要

结构种类型系统进行比较的每个方法的签名(整个结构)。鸭子输入比较方法,是有关的具体任务(结构有关的任务)。

鸭打字装置 如果它只是适合的,它的确定

这适用于这两种类型的动态

def foo obj
    obj.quak()
end

或静态类型,编制语言

template <typename T>
void foo(T& obj) {
    obj.quak();
}

这一点是,在这两个例子中,没有任何信息的类型给出。只是当使用(无论是在运行时或编译时间!), 的类型进行检查,并如果所有要求得到满足,代码的工作。值 没有一个明确的类型 在他们的观点的宣言》。

结构类型依赖于 明确的打字 你的价值观,只是像往常一样-所不同的只是具体类型是不确定的继承,但通过它的结构。

一个结构类型的代码(斯卡拉-style)上述例子就是

def foo(obj : { def quak() : Unit }) {
    obj.quak()
}

不要混淆这个事实,即一些在结构上类型的语言,如OCaml结合这种类型的推断为了防止我们从定义的类型明确。

我不知道,如果它真的回答了你的问题,但是...

模板C++代码看起来非常像鸭子-打字,但是静态的,编纂时的、结构性的。

template<typename T>
struct Test
{
    void op(T& t)
    {
        t.set(t.get() + t.alpha() - t.omega(t, t.inverse()));
    }
};

这是我的理解是,结构类型,是使用按类型inferencers等,以确定类型的信息(认为Haskell或OCaml),同时鸭打字不关心"类型"本身,只是这件事可以处理一个具体方法的调用/性访问,等等。(觉得 respond_to? 红宝石或能力的检查在Javascript)。

那里总会有例子的一些编程语言,违反一些定义的各种条款。例如flash player支持做鸭子-打字编程上的实例,是不是技术上的动态。

var x:Object = new SomeClass();
if ("begin" in x) {
    x.begin();
}

在这种情况下,我们如果测试对象实例,在"x"有一个方法"开始"之前的呼叫它,而不是使用一个接口。这个工作as和几乎是鸭子-打字,虽然这类SomeClass()不可以本身就是动态的。

在有些情况下,其动态鸭打字和类似静-输入代码(在即C++)的表现不同:

template <typename T>
void foo(T& obj) {
    if(obj.isAlive()) {
        obj.quak();
    }
}

C++,对象必须拥有两者 isAlivequak 方法,用于代码汇编;对于相当于代码类型的动态语言、对象仅需要有 quak 如果方法 isAlive() 返回正确的。我解释这一差异之间的结构(结构输入)和行为(鸭打字).

(但是,我达到这一解释通过把维基百科"鸭子-打字必须是动态的"表面价值,并试图使其有意义。备用的解释,隐含的结构类型是鸭打字也是连贯一致。)

我看到"鸭子输入"更为编程式,而"结构输入"是一种系统的功能。

结构打字指的是对能力的种类型的系统 表达 类型,包括所有的价值有一定的结构特性。

鸭打字指的是编写代码,只是使用该功能的价值,它是通过实际需要的工作,而不强加任何其他限制。

所以我可以 使用 结构种类型的代码一只鸭子打字风格,通过正式宣告我"鸭子类"结构类型。但我还可以使用的结构类型 没有 "做鸭打字"。例如,如果我写的接口一大堆有关的功能/方式/程序/谓/课程/无论通过声明和命名的一个共同的结构类型,然后使用,无处不在,它是非常可能的是,一些代码单位不需要 所有 特征的结构类型,和所以我们不必要地限制一些他们拒绝的价值观上,他们理论上可以正常工作。

因此,虽然我可以看到如何有共同点,我不认为鸭打字包括结构。我对他们认为,鸭打字甚至不是一个东西,可能已经能够纳入结构类型,因为他们不是同样的事情。想鸭打字在动态的语言为只是"暗示的,未经检查的结构类型"缺失的东西,恕我直言。鸭打字是一个编码的风格你选择使用或不,不仅仅是一个技术特征的一种编程语言。

例如,它可以使用 isinstance 检查蟒蛇假OO式"类或亚类"类型的约束。这也有可能检查特定的属性和方法,假结构类型的限制(你甚至可以把检查在外部的功能,从而有效地获得一名结构的类型!).我会要求,无论这些选项是举例说明鸭子类型(除非结构类型是相当精细和保持在接近同的代码检查)。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top