没有鸭子类型的动态类型?

7

我习惯于动态类型,这意味着在运行时检查对象/非面向对象结构的类型信息,并抛出某种类型错误,即如果它像鸭子一样叫,那么它就是鸭子。是否有不同类型的动态类型(请详细说明)。

2个回答

5

是的,完全正确。"鸭子类型"是一种说法,它表明一个值在某个时刻的类型基于其当前具有的字段和方法。动态类型只是说类型与运行时值相关联,而不是与静态变量和参数相关联。这两者之间有所不同,您可以使用后者而不使用前者。

例如,如果您在PHP中编程并限制自己只使用基本类型而不使用面向对象编程,则将使用动态类型而不使用鸭子类型。


你能详细说明一下你的例子吗?你是不是在说运行时类型检查就是动态类型,而基于测试对象方法和属性存在性的检查被称为鸭子类型?也就是说,你会说这两者之间的区别与对象有关吗?在这两种情况下(非鸭子动态和鸭子类型),似乎都是在运行时检查某些操作(方法调用、加法等)与输入值的兼容性;对吗?唯一的区别是鸭子类型涉及对象,而动态类型更通用,对吗? - Eric O. Lebigot
1
@EOL:是的,类型检查是动态类型(其实应该叫做“动态检查”),检查属性是否存在是鸭子类型。关于“涉及对象”的事情有点模糊,说它是正确的可能不太准确,但我认为我们都明白了。 - Paul Biggar
谢谢!我现在更清楚地看到了这两者之间的区别。 - Eric O. Lebigot

1
不,动态类型是指值具有类型但变量没有,因此大多数类型检查在运行时完成。所以,基本上,如果这个值走起来或者叫起来像一只鸭子,那么它就是一只鸭子,否则就会抛出一个错误。鸭子类型实际上只描述了动态类型的一个特性,确保它是类型安全的(即仅当变量foo具有正确的属性或可以执行该方法时,方法才会运行)。

4
那是不正确的。它并没有检查类型,只是检查类型能否执行某个运算符X或具有某些属性Y。如果你在一个变量上调用比如toString()方法,那么如果它是一个对象并且实现了toString()方法,那么它将被调用,否则会报错。但许多类型都可以满足这个要求。 - siride

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接