Я знаю, что не даю обобщенного ответа. В 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>