【问题标题】:Dynamic Typing without duck typing?没有鸭子类型的动态类型?
【发布时间】:2011-03-23 21:01:42
【问题描述】:

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

【问题讨论】:

    标签: duck-typing dynamic-typing


    【解决方案1】:

    是的,当然。 Duck-typing 是一个习惯用法,它表示此时值的类型基于它现在拥有的字段和方法。动态类型只是说类型与运行时值相关联,而不是与静态变量和参数相关联。两者是有区别的,可以用后者不用前者。

    例如,如果您使用 PHP 编程并限制自己使用基本类型而不使用 OO,那么您将使用动态类型而不使用鸭子类型。

    【讨论】:

    • 你能详细说明你的例子吗?您是说运行时的类型检查是动态类型,而基于测试对象的方法和属性的存在进行检查称为鸭子类型吗?也就是说,你会说两者之间的区别与objects有关吗?在这两种情况下(非鸭子动态和鸭子类型),看起来某些操作(方法调用、加法等)与输入值的兼容性是在运行时检查的;那正确吗?唯一的区别是鸭子类型涉及对象,而动态类型更通用,对吧?
    • @EOL:是的,类型检查是动态类型(应该真正称为“动态检查”,检查属性是否存在是鸭子类型。“关注对象”的说法有点含糊这是正确的,但我认为我们都在同一页上。
    • 谢谢!我现在更清楚地看到了两者之间的区别。
    【解决方案2】:

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

    【讨论】:

    • 这是不正确的。它不检查类型,只检查类型可以执行某些运算符 X 或具有某些属性 Y。如果您在变量上调用 toString(),那么如果它是一个对象并且它实现了一个 toString() 方法, 那么它将被调用,否则,你会得到一个错误。但是很多类型都可以满足这个要求。
    猜你喜欢
    • 2010-09-22
    • 1970-01-01
    • 2015-05-21
    • 1970-01-01
    • 1970-01-01
    • 2018-07-25
    • 1970-01-01
    • 2018-10-11
    • 1970-01-01
    相关资源
    最近更新 更多