Ну я сперва удивился, мол, какая еще утиная типизация в статическом ЯП, а потом понял, что технически никакой интерфейс в foreach и не нужен, компилятор может смотреть есть ли нужный метод и вызывать его. Почему-то неожиданно для статической типизации (обычно всё нужно синтаксически обговаривать, недостаточно просто метода с нужным названием), но легко реализуемо.
Статическая типизация не отменяет наличие утиной.
Только разве что локально. Например сигнатуре функции всё же нужен какой-то тип, но обычно интерфейсы заменяют утиную типизацию. А настоящщая, как мне кажется, утиная типизация это когда вот так: function foo(obj) { return obj.bar() } Хотя могу и ошибаться
> Почему-то неожиданно для статической типизации Потому что меинстримные языки топчутся на месте и разиваются вопреки.
Это динамическая типизация
Я думал, идея утиной типизации только с ней может работать так, как ее озвучивают
Структурная (утиная) типизация может быть как в статике так и в динамике
И как она может на полную работать в статике?
Хотя я краем глаза видел TypeScript, там вместо типа можно писать как-то типа { prop1: Node, prop2: String }
Фарш позволяет функции вида Int Foo<T: int Length ()>(T t) => t.Length();
Чувствуется какой-то подвох... А на эффективности это как-то сказывается? Хотя раз там дженерик, то все проверки наверное могут быть и на этапе компиляции...
Это зерокост дженерик, проверяется а компайл тайме, всё ж известно
И в F# такое есть
Обсуждают сегодня