为了账号安全,请及时绑定邮箱和手机立即绑定

鸭子打字是什么?

鸭子打字是什么?

鸭子打字是什么?我碰到了这个词鸭型在网上阅读随机话题时,并没有完全理解它。什么是“鸭子打字”?
查看完整描述

3 回答

?
慕尼黑8549860

TA贡献1818条经验 获得超11个赞

鸭型意味着一个操作未正式指明它的操作数必须满足的要求,但是试试看得到了什么。

与其他人所说的不同,这不一定与动态语言或继承问题有关。

示例任务:调用某种方法Quack在物体上。

使用鸭子类型,一个函数f执行此任务必须事先指定其参数必须支持某些方法。Quack..一个常见的方法是使用接口。

interface IQuack { 
    void Quack();
}

void f(IQuack x) { 
    x.Quack(); 
}

呼叫f(42)失败了,但是f(donald)工作时间只要donaldIQuack-亚型。

另一种方法是结构分型-但同样,方法Quack()正式指定任何不能证明这一点的东西。quack提前将导致编译器失败。

def f(x : { def Quack() : Unit }) = x.Quack()

我们甚至可以写

f :: Quackable a => a -> IO ()
f = quack

在哈斯克尔Quackable类型化确保了我们方法的存在。



所以怎么鸭型改变这个?


嗯,就像我说过的,鸭子打字系统没有指定要求,但是只要试一试就行了.

因此,Python的动态类型系统总是使用鸭子类型:

def f(x):
    x.Quack()

如果f获取一个x支持Quack(),一切都很好,如果不是,它将在运行时崩溃。

但是鸭子类型并不意味着动态输入-事实上,有一种非常流行但完全静态的鸭子类型方法,它也没有给出任何要求:

template <typename T>
void f(T x) { x.Quack(); }

这个函数没有以任何方式表明它想要一些xQuack,所以它只是尝试编译时如果一切顺利的话,一切都会好起来的。


查看完整回答
反对 回复 2019-07-11
?
慕少森

TA贡献2019条经验 获得超9个赞

简单解释(没有代码)

对这个问题的语义的讨论是相当细微的(而且非常学术性的),但是这里有一个总的想法:

鸭型

(“如果它走路像鸭子,叫起来像鸭子,那它就是鸭子。”)-是!但这是什么意思?!最好的例子是:

示例:动态类型语言

想象一下我有一根魔杖。它有特殊的力量。如果我挥动魔杖说“开车!”去一辆车,好吧,它会开车的!

它对其他事情有用吗?不确定:所以我在卡车上试了一下。哇-它也会开车!然后我在飞机,火车和1伍兹(他们是一种高尔夫球俱乐部,人们用来“驾驶”高尔夫球)。他们都开车!

但是它能用在一个茶杯上吗?错误:KAAAA-BOOOOOOM!结果不太好。=>茶杯不能开!啊!?

这基本上就是鸭子输入的概念。是个试着先买然后再买系统。如果成功了,一切都会好起来的。但如果失败了,它会在你脸上炸开的。

换句话说,我们感兴趣的是能行,而不是和物体是什么.

示例:静态类型化语言

如果我们关心的是目标到底是什么,然后我们的魔术将只适用于预置,授权类型-在这种情况下,汽车,但是将在其他可以驱动的对象上失败。:卡车,轻便摩托车,突克-土豆泥等,因为我们的魔杖期待着它不能在卡车上使用。只在汽车上工作.

换句话说,在这个场景中,魔杖非常仔细地查看对象(这是一辆车吗?)而不是对象能行(例如汽车、卡车等是否能驾驶)。

你能得到一辆卡车的唯一方法就是你能得到魔法棒来期待这两辆卡车。CARS(也许是通过“实现公共接口”来实现的)。如果你不知道这意味着什么,那就暂时忽略它。

摘要:关键退出

鸭子类型中最重要的是对象实际上可以做,而不是对象.


查看完整回答
反对 回复 2019-07-11
  • 3 回答
  • 0 关注
  • 625 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信