Статическая типизация означает, что после того, как вы определили переменную, она остается того же типа в течение всего срока ее службы.Статические языки обычно требуют, чтобы вы объявили тип, но у некоторых есть вывод типа - они выведут тип из определения.В 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
Почему вы хотите сделать это, я не знаю, но этот выбор доступен для языковых дизайнеров.