Все ли динамические языки поддерживают утиный ввод?
Я бы подумал, что PHP поддерживает утиную печать. Так ли это?
Все ли динамические языки поддерживают утиный ввод?
Я бы подумал, что PHP поддерживает утиную печать. Так ли это?
Любой язык oop с динамической типизацией поддерживает утиную печать, включая php.
Это не особенность, это скорее стиль программирования.
Статическая типизация означает, что после того, как вы определили переменную, она остается одного и того же типа на протяжении всего времени существования. Статические языки обычно требуют, чтобы вы объявляли тип, но некоторые из них имеют вывод типа - они будут выводить тип из определения. В 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
Я не знаю, зачем вам это нужно, но этот выбор доступен разработчикам языков.
Да, PHP - это язык с утиным типом.
$x = 1;
$x = 'string';
$x = new Person;
$x = 1 / 2;
$duck->quack()
(не заботясь о фактическом классе $ duck, только о том, что он может крякать)
- person Kamil Tomšík; 09.04.2011