Поддерживает ли все поддерживаемые динамические языки duck typing?Поддерживаются ли все динамические языки утиной?
Я бы подумал, что PHP поддерживает утиную печать. Это так?
Поддерживает ли все поддерживаемые динамические языки duck typing?Поддерживаются ли все динамические языки утиной?
Я бы подумал, что PHP поддерживает утиную печать. Это так?
Любой динамически типизированный язык ООП поддерживает утку-типизации, включая PHP.
Это не особенность, это скорее стиль программирования.
Да, PHP - это язык, утиный языком.
$x = 1;
$x = 'string';
$x = new Person;
$x = 1/2;
Как насчет первого вопроса? – Gumbo
Речь идет не о duck-typing, '$ duck-> quack()' (не заботясь о том, что фактический класс $ duck как раз и может ошеломлять) –
Статическое типирование означает, что после того, как вы определили переменную, он останется прежним для своего срока службы. Статические языки обычно требуют, чтобы вы объявляли тип, но некоторые имеют тип вывода - они выведут тип из определения. Например, в scala вы можете написать i = 1
, и компилятор выведет тип i
как int
, но вы не сможете объявить i = "1"
, что вызовет ошибку.
Динамическое типирование означает, что вам не нужно объявлять тип переменной, и вы можете изменить тип переменной. В рубине вы можете следить за i = 1
с i = "1"
и проблем нет.
Duck typing - это другая концепция, которая применяется почти исключительно к объектно-ориентированным языкам. На языке с заданием Duck аргументы метода не проверяются для типа, поэтому любой тип, который вы передаете в метод, допустим, если он отвечает на любые полученные им вызовы.
Так, например:
class Duck
def quacks
puts "Quack"
end
end
class FauxDuck
def quacks
puts "FauxQuack"
end
end
def quacker duck
duck.quacks
end
Метод quacker будет принимать либо утку или 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
Почему вы хотели бы это сделать, я не знаю, но это выбор доступен для разработчиков языка.
Duck Typing - это определенно языковая функция, а не стиль программирования. Динамически типизированный язык * может * объявлять и применять типы вызовов методов, и если бы это было так, то это не поддерживало бы утиную печать. – philosodad