Все ли динамические языки поддерживают утиную печать?

Все ли динамические языки поддерживают утиный ввод?

Я бы подумал, что PHP поддерживает утиную печать. Так ли это?


person Howard    schedule 09.04.2011    source источник


Ответы (3)


Любой язык oop с динамической типизацией поддерживает утиную печать, включая php.

Это не особенность, это скорее стиль программирования.

person Kamil Tomšík    schedule 09.04.2011
comment
Duck Typing - это определенно функция языка, а не стиль программирования. Язык с динамической типизацией мог объявлять и применять типы для вызовов методов, и если бы это было так, то он не поддерживал бы утиную типизацию. - person philosodad; 02.04.2015

Статическая типизация означает, что после того, как вы определили переменную, она остается одного и того же типа на протяжении всего времени существования. Статические языки обычно требуют, чтобы вы объявляли тип, но некоторые из них имеют вывод типа - они будут выводить тип из определения. В scala, например, вы можете написать i = 1, и компилятор определит, что тип i будет int, но вы не можете затем объявить i = "1", это вызовет ошибку.

Динамическая типизация означает, что вам не нужно объявлять тип переменной, и вы можете изменить тип переменной. В ruby ​​вы можете следовать за i = 1 с помощью i = "1", и это вообще не проблема.

Утиная типизация - это другая концепция, которая применяется почти исключительно к объектно-ориентированным языкам. В языке с утиной типизацией аргументы метода не проверяются на тип, поэтому любой тип, который вы передаете в метод, является приемлемым, если он отвечает на любые получаемые вызовы.

Так, например:

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

Я не знаю, зачем вам это нужно, но этот выбор доступен разработчикам языков.

person philosodad    schedule 06.02.2015

Да, PHP - это язык с утиным типом.

$x = 1;
$x = 'string';
$x = new Person;
$x = 1 / 2;
person TaylorOtwell    schedule 09.04.2011
comment
А как насчет первого вопроса? - person Gumbo; 09.04.2011
comment
это не о типе утки, $duck->quack() (не заботясь о фактическом классе $ duck, только о том, что он может крякать) - person Kamil Tomšík; 09.04.2011