Другие ответы здесь будут хорошо работать с вашим текущим вводом. Что-то вроде:
def minusNumber(array)
array.map do |e|
if e.is_a?(Integer) && e != 0
e - 2
else
e
end
end
end
Но вот более гибкое решение. Это может быть слишком сложным для вас, где вы сейчас находитесь, но все обучение - это хорошее обучение: -)
Ruby - это язык, который допускает полиморфизм в своих переменных. Используя пример ввода для вашего метода, вы можете видеть, что переменная e
может содержать объект String
или объект Integer
. Но на самом деле он может содержать любой тип объекта, и Ruby не будет заботиться об одном бите, если только он не обнаружит ошибку при использовании переменной.
Итак. В вашем примере вам нужно сохранить Integer
s в выводе. Но что, если в будущем вам понадобится передать массив, содержащий несколько Score
объектов, и они вам понадобятся и в вашем выводе? Это совершенно новый класс, который вы еще даже не написали, но знаете, что позже вы это сделаете. Есть способ, которым вы можете переписать свой метод, который будет предвидеть этот будущий класс, и все другие классы типа Integer
, которые вы можете когда-нибудь написать.
Вместо использования #is_a?
для проверки типа объекта используйте #respond_to?
, чтобы проверить, какие методы он реализует.
Любой класс, который может использоваться как целое число , должен реализовывать метод #to_int
. Integer
конечно, и ваш класс Score
будет, но String
нет. И ни один другой класс не может рассматриваться как целое число. Так что это будет работать для всех типов значений, правильно разделяя те, которые отвечают на #to_int
, и те, которые не отвечают.
def minusNumber(array)
array.map do |e|
if e.respond_to?(:to_int) && e != 0
e - 2
else
e
end
end
end
Опять же, этот материал может быть немного продвинутым, но хорошо бы привыкнуть рано думать о переменных с точки зрения их методов, а не их типа. Этот способ мышления поможет вам позже.