Все ли динамические языки поддерживают утку? - PullRequest
1 голос
/ 09 апреля 2011

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

Я думаю, что PHP поддерживает типизацию утки.Это тот случай?

Ответы [ 3 ]

6 голосов
/ 09 апреля 2011

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

Это не функция, а скорее стиль программирования.

0 голосов
/ 06 февраля 2015

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

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

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

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

class Duck
  def quacks
    puts "Quack"
  end
end

class FauxDuck
  def quacks
    puts "FauxQuack"
  end
end

def quacker duck
  duck.quacks
end

Метод-квакер примет либо Duck, либо FauxDuck, потому что любой из них будет реагировать на .quacks

Хотя большинство объектно-ориентированных динамически типизированных языков также имеют тип duck, он нене требуется.У вас мог бы быть язык, который объявлял типы для вызовов методов и применял их, но все еще был динамически типизирован - помните, что динамическая типизация просто означает, что вы можете изменить тип объекта после того, как вы его определили.

В гипотетическом не набранном уткой ruby ​​

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

Почему вы хотите сделать это, я не знаю, но этот выбор доступен для языковых дизайнеров.

0 голосов
/ 09 апреля 2011

Да, PHP является языком типа "утка".

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