Что такое утка? - PullRequest
       64

Что такое утка?

363 голосов
/ 17 ноября 2010

Я наткнулся на термин утка, набрав , когда читал случайные темы о программном обеспечении в Интернете, и не совсем понял его.

Что такое «типирование утки»?

Ответы [ 12 ]

2 голосов
/ 20 июня 2014

Я знаю, что не даю обобщенного ответа. В Ruby мы не объявляем типы переменных или методов - все это просто какой-то объект. Таким образом, правило «Классы не являются типами»

В Ruby класс никогда не является (ок, почти никогда) типом. Вместо этого тип объекта определяется в большей степени тем, что может сделать этот объект. В Ruby мы называем это уткой. Если объект ходит как утка и говорит как утка, то переводчик с удовольствием обращается с ним, как с уткой.

Например, вы можете написать процедуру для добавления информации о песне в строку. Если вы пришли из C # или Java-фона, у вас может возникнуть желание написать это:

def append_song(result, song)
    # test we're given the right parameters 
    unless result.kind_of?(String)
        fail TypeError.new("String expected") end
    unless song.kind_of?(Song)
        fail TypeError.new("Song expected")
end

result << song.title << " (" << song.artist << ")" end
result = ""

append_song(result, song) # => "I Got Rhythm (Gene Kelly)"

Охватите утку Руби, и вы напишите что-то гораздо более простое:

def append_song(result, song)
    result << song.title << " (" << song.artist << ")"
end

result = ""
append_song(result, song) # => "I Got Rhythm (Gene Kelly)"

Вам не нужно проверять тип аргументов. Если они поддерживают << (в случае результата) или название и исполнителя (в случае песни), все будет работать. Если этого не произойдет, ваш метод все равно сгенерирует исключение (так же, как если бы вы проверили типы). Но без чека ваш метод внезапно становится намного более гибким. Вы можете передать ему массив, строку, файл или любой другой объект, который добавляется с помощью <<, и это будет просто работать. </p>

0 голосов
/ 13 февраля 2019

Я думаю, что смешивать динамическую типизацию, статическую типизацию и типизацию по типу утиной.Утиная типизация является независимой концепцией, и даже статический типизированный язык, такой как Go, может иметь систему проверки типов, которая реализует типизацию утиной типизации.Если система типов будет проверять методы (объявленного) объекта, но не типа, это можно назвать языком типизации утки.

...