Подтвердить что ты не робот

Ruby не подразумевается преобразование Fixnum в String (TypeError)

Я пытаюсь ответить на следующий вопрос из книги Криса Пайн "Учись программировать":

Високосные годы. Напишите программу, которая запрашивает начальный год и год окончания, а затем переносит все високосные годы между ними (и включая их, если они также високосные годы). Високосные годы - это годы, делящиеся на 4 (например, 1984 и 2004). Однако годы, делящиеся на 100, не являются високосными (например, 1800 и 1900 годы), если они также не делятся на 400 (например, 1600 и 2000 годы, которые фактически были високосные годы). Какой беспорядок!

При запуске моего кода появляется следующая ошибка:

leap_year.rb: 12: in +': no implicit conversion of Fixnum into String (TypeError) from leap_year.rb:12:in '

Вот мой код:

#leap years

puts 'What is the starting year?'
starting_year = gets.chomp
puts 'What is the ending year?'
ending_year = gets.chomp

while starting_year <= ending_year
  if starting_year%4 == 0 && (starting_year%100 != 0 && starting_year%400 == 0)
    puts starting_year 
  end 
  starting_year+=1
end
4b9b3361

Ответ 1

Добавьте .to_i к вашим вызовам gets.chomp. Вы пытаетесь выполнять математические операции над текстом. При вводе с консоли все начинается как текст, даже если это числовой текст.

Ответ 2

Это потому, что вход от gets.chomp равен String. Вы не можете выполнять modulo (%) на String. Сначала вам нужно преобразовать его в целое число.

Попробуйте это...

puts 'What is the starting year?'
starting_year = gets.chomp.to_i
puts 'What is the ending year?'
ending_year = gets.chomp.to_i

while starting_year <= ending_year
  if starting_year%4 == 0 && (starting_year%100 != 0 && starting_year%400 == 0)
    puts starting_year 
  end 
  starting_year+=1
end

Теперь это работает?