【问题标题】:Do all dynamic languages support duck typing?所有动态语言都支持鸭子类型吗?
【发布时间】:2015-02-06 08:00:34
【问题描述】:

所有动态语言都支持duck typing吗?

我认为 PHP 支持鸭子类型。是这样吗?

【问题讨论】:

    标签: php types duck-typing


    【解决方案1】:

    任何动态类型的 oop 语言都支持鸭子类型,包括 php。

    这不是功能,而是编程风格。

    【讨论】:

    • Duck Typing 绝对是一种语言特性,而不是一种编程风格。动态类型语言可以为方法调用声明和强制执行类型,如果这样做了,那么它将不支持鸭子类型。
    【解决方案2】:

    静态类型意味着一旦你定义了一个变量,它就会在它的生命周期内保持相同的类型。静态语言通常要求您声明类型,但有些具有类型推断——它们会从定义推断类型。比如在scala中,你可以写i = 1,编译器会推断i的类型是int,但是你不能再声明i = "1",那样会报错。

    动态类型意味着您不必声明变量的类型,您可以更改变量的类型。在ruby中,你可以关注i = 1i = "1",完全没有问题。

    Duck 类型是一个几乎完全适用于面向对象语言的不同概念。在使用 Duck 类型的语言中,不会检查方法的参数的类型,因此您传递给方法的任何类型都是可以接受的,只要它响应它收到的任何调用。

    所以,例如:

    class Duck
      def quacks
        puts "Quack"
      end
    end
    
    class FauxDuck
      def quacks
        puts "FauxQuack"
      end
    end
    
    def quacker duck
      duck.quacks
    end
    

    方法 quacker 将采用 Duck 或 FauxDuck,因为两者都会响应 .quacks

    虽然大多数面向对象的动态类型语言也是鸭子类型的,但这不是必需的。您可以使用一种语言来为方法调用声明类型并强制执行它们,但仍然是动态类型的——请记住,动态类型只是意味着您可以在定义对象后更改它的类型。

    在假设的非鸭类型红宝石中

    class Duck
      def quacks
        puts "Quack"
      end
    end
    
    class FauxDuck
      def quacks
        puts "FauxQuack"
      end
    end
    
    def quacker Duck duck
      duck.quacks
    end
    
    duck = Duck.new
    quacker.duck ## no error
    duck = FauxDuck.new ##redefining the type of the variable
    quacker.duck ## throws an error at runtime
    

    我不知道您为什么要这样做,但这是语言设计人员可以选择的。

    【讨论】:

      【解决方案3】:

      是的,PHP 是一种鸭式语言。

      $x = 1;
      $x = 'string';
      $x = new Person;
      $x = 1 / 2;
      

      【讨论】:

      • 第一个问题呢?
      • 这不是鸭子打字,$duck->quack() 是(不关心 $duck 的实际类别,只是它会嘎嘎)
      猜你喜欢
      • 2010-09-22
      • 1970-01-01
      • 2013-05-24
      • 1970-01-01
      • 2011-03-23
      • 2011-02-25
      • 1970-01-01
      • 1970-01-01
      • 2011-01-18
      相关资源
      最近更新 更多