2010-08-01 40 views
7

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

回答

1

不,动态类型是当值有类型但变量没有时,所以大多数类型检查是在运行时完成的。所以,基本上,如果价值像鸭子一样散步或呱呱叫,那就是一只鸭子,否则就会引发错误。 Duck打字实际上只是描述了动态类型的一个特性,它确保它是类型安全的(即只有在变量foo'具有正确的属性或可以执行该方法时,方法才会运行)。

+4

这是不正确的。它不检查类型,只是该类型可以执行某个运算符X或具有某个属性Y.如果对变量调用toString(),那么如果它是一个对象并且它实现了toString()方法,那么它将被调用,否则,你会得到一个错误。但是很多类型都可以满足这个要求。 – siride 2010-08-01 14:57:16

+0

好点,我会编辑 – 2010-08-01 15:22:36

5

是的,绝对。鸭子打字是一种习惯用语,它表示此时此刻的价值类型是基于它现在拥有的领域和方法。动态类型只是说类型与运行时间值相关,而不是静态变量和参数。两者之间有区别,你可以在没有前者的情况下使用后者。例如,如果您使用PHP进行编程并将自己的基本类型限制为不使用OO,那么您将使用动态输入而不使用鸭子输入。

+0

你能否详细说明你的例子?你只是说在运行时检查类型是动态类型,而基于测试方法和属性的对象检查被称为鸭子打字?即,你会说,两者之间的差异与*对象*有关吗?在这两种情况下(非鸭动态和鸭打字),它看起来像运行时检查某些操作(方法调用,添加等)与输入值的兼容性;是对的吗?唯一的区别是鸭子打字涉及对象,而动态打字更为普遍,对吗? – EOL 2011-01-07 09:53:34

+1

@EOL:是的,类型检查是动态类型的(应该真的叫做'动态检查',检查属性存在是鸭子打字。'关注对象'的东西有点模糊,说它是正确的,但我认为我们'都在同一页上。 – 2011-01-08 01:13:40

+0

谢谢!我现在看到两者之间更好的区别。 – EOL 2011-01-08 22:31:56