Другие указали, как вы можете технически применять тип аргумента, но вы сражаетесь с фундаментальной битвой с рубиновым мышлением. Google для «утиной печати».
В мире рубинов мы обычно не беспокоимся о типе аргумента, а скорее о том, соответствует ли он интерфейсу того, что мы хотим с ним делать. Другими словами, делает ли это кражу, как утка? Достаточно хорошо!
Давайте предположим, что вы пытаетесь использовать массив для чего-то:
def function(arg)
arg.each do |a|
puts a
end
end
Если вы называете это как: function(1)
, вы получите NoMethodError: undefined method 'each'
Давайте использовать идею заставляя его быть массивом.
def function(arg)
raise TypeError unless arg.is_a? Array
arg.each do |a|
puts a
end
end
Хорошо, теперь мы сделали другую ошибку, но если метод вызывается с чем-то другим, чем массив, он еще генерирует ошибку.
Кроме того, что относительно этого?
function("Hello World".chars)
Упс, у нас есть ошибки, несмотря на то, что функция бы работала!
рубин путь будет что-то подобное:
def function(arg)
if arg.respond_to? :each
arg.each do |a|
puts a
end
else
puts arg
end
end
Теперь ваша функция работает хорошо для всех видов входов:
function([1,2,3,4])
function("foo")
function("foo".chars)
Что касается правильности функции, вы покрываете, что используя тесты, а не компилятор. Но это еще одна тема. :)
вместо 'возвращения«Error'' вы, вероятно, хотите сделать 'поднять ArgumentError', но кроме этого я не думаю, что его собирается получить намного лучше –