Утиный ввод, это должно быть динамично?

Википедия раньше говорила* о вводе утки:

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

(* Ed.примечание: Так как этот вопрос был отправлен, статья Wikipedia была отредактирована для удаления "динамичного" слова.)

Это говорит о структурном вводе:

Структурная система типов (или основанная на свойстве система типов) является главным классом системы типов, в которой соответствие типов и эквивалентность определяются структурой типа, а не через явные объявления.

Это контрастирует структурное выделение подтипов с вводом утки как так:

[Структурные системы] контрастируют с... утиным вводом, в котором только часть структуры, к которой получают доступ во времени выполнения, проверяется на совместимость.

Однако термин ввод утки, кажется, мне, по крайней мере, интуитивно включает в категорию структурные системы выделения подтипов. На самом деле Википедия говорит:

Название понятия [ввод утки] относится к утиному тесту, приписанному James Whitcomb Riley, который может формулироваться следующим образом: "когда я вижу птицу, которая идет как утка и плавает как утка и шарлатаны как утка, я называю ту птицу уткой".

Таким образом, мой вопрос: почему я не могу назвать структурный ввод утки выделения подтипов? Там даже существуйте динамически типизированные языки, которые не могут также быть классифицированы как вводимый уткой?

Постскриптум:

Как кто-то названный daydreamdrunk на reddit.com, так красноречиво помещенном - это, "Если это компилирует как утка и связывается как утка..."

Постпостскриптум

Много ответов, кажется, в основном просто перехешируют то, что я уже заключил в кавычки здесь, не рассматривая более глубокий вопрос, который является, почему бы не использовать термин ввод утки для покрытия и динамического контроля типов и структурного выделения подтипов? Если Вы только хотите говорить о вводе утки и не структурном выделении подтипов, то просто называют его, каково это: динамический членский поиск. Моя проблема состоит в том, что ничто о термине ввод утки не говорит мне, это только относится к динамическим языкам.

24
задан 6 revs, 4 users 63% 14 March 2014 в 21:42
поделиться

6 ответов

Шаблоны C++ и D являются прекрасным примером набора уток, который не является динамическим. Это определенно:

-печатание, при котором текущий набор методов объекта и свойства определяет действительный семантика, а не её наследование из определённого класса или внедрение конкретного Интерфейс.

Вы не указываете явно интерфейс, от которого ваш тип должен наследовать, чтобы инстанцировать шаблон. Он просто должен иметь все возможности, которые используются внутри определения шаблона. Однако, все решается во время компиляции и компилируется вплоть до необработанных, непостижимых шестнадцатеричных чисел. Я называю это "время компиляции утка печатает". Я написал целые библиотеки из этого мышления, что неявная инстанциация шаблона является компиляция время утка печатать и думаю, что это одна из самых недооцененных возможностей там.

.
26
ответ дан 28 November 2019 в 22:27
поделиться

Система структурного типа

Система структурного типа сравнивает один полный тип с другим целым типом, чтобы определить, являются ли они совместимыми. Для того, чтобы два типа A и B были совместимы, A и B должны иметь одинаковую структуру - т.е. каждый метод на A и на B должен иметь одну и ту же подпись.

Тип утки

Тип утки считает два типа эквивалентными для рассматриваемой задачи , если они оба могут справиться с этой задачей. Для того, чтобы два типа A и B были эквивалентны куску кода, который хочет записать в файл, A и B должны реализовать метод записи.

Резюме

Системы структурных типов сравнивают каждую сигнатуру метода (всю структуру). Тип утки сравнивает методы, имеющие отношение к конкретной задаче (структура, имеющая отношение к задаче)

.
14
ответ дан 28 November 2019 в 22:27
поделиться

Утиный набор текста означает Если он просто подходит, то это OK

Это относится как к динамически набранным

def foo obj
    obj.quak()
end

, так и к статически набранным, скомпилированным языкам

template <typename T>
void foo(T& obj) {
    obj.quak();
}

Дело в том, что в обоих примерах, не было никакой информации о данном типе. Как раз при использовании (во время исполнения или компиляции!), типы проверяются, и если все требования выполнены, код работает. Значения на момент объявления не имеют явного типа.

Структурный тип опирается на явный набор ваших значений, как обычно - Разница в том, что конкретный тип идентифицируется не по наследованию, а по его структуре.

Структурно типизированный код (в стиле Scala) для вышеприведенного примера был бы

def foo(obj : { def quak() : Unit }) {
    obj.quak()
}

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

.
10
ответ дан 28 November 2019 в 22:27
поделиться

Не уверен, что она действительно отвечает на ваш вопрос, но... .

6
ответ дан 28 November 2019 в 22:27
поделиться

Насколько я понимаю, структурная типизация используется для определения информации о типе (думаю, Haskell или OCaml), в то время как утиная типизация не заботится о "типах" как таковых, просто эта штука может обрабатывать вызов/доступ к определенным методам и т.д. (думаю, response_to? в Ruby или проверка возможностей в Javascript).

.
5
ответ дан 28 November 2019 в 22:27
поделиться

Всегда будут примеры из некоторых языков программирования, которые нарушают некоторые определения различных терминов. Например, ActionScript поддерживает программирование в стиле "утка-тип" на экземплярах, которые технически не являются динамическими.

var x:Object = new SomeClass();
if ("begin" in x) {
    x.begin();
}

В данном случае мы тестировали, имеет ли экземпляр объекта в "x" метод "start" перед его вызовом, а не с использованием интерфейса. Это работает в ActionScript и является в основном утиным типизированием, хотя класс SomeClass() сам по себе может и не быть динамическим

.
5
ответ дан 28 November 2019 в 22:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: