Когда текст читается с использованием gets
, он считывается как строка. Так что в вашем коде number
на самом деле не число, а строка. Из-за этого, оператор «модуль», на самом деле не оператора модуля, но оператор формата на String
, String#%
:
Format-Польза ул как спецификации формата, и возвращает результат его применения к arg. Если спецификация формата содержит более одной подстановки, тогда arg должен быть массивом или хэшем, содержащим значения, подлежащие замене. См. Kernel :: sprintf для получения подробной информации о строках формата.
"%05d" % 123 #=> "00123"
"%-5s: %08x" % [ "ID", self.object_id ] #=> "ID : 200e14d6"
"foo = %{foo}" % { :foo => 'bar' } #=> "foo = bar"
Как вы можете видеть, этот метод возвращает строку, которая не равна нулю. Поэтому в этой программе всегда будет указано, что номер не делится на 3, даже если это так.
Вы можете это исправить, вызвав to_i
на входе вернулся из get
:
number = gets.chomp.to_i
Не нужно 'chomp' значение. 'to_i' будет заботиться только о цифрах в строке и будет игнорировать конечную новую строку. См. «[Всегда ли нужно использовать« chomp »перед использованием' to_i' или 'to_f'?] (Http://stackoverflow.com/questions/20598679/is-it-ever-necessary-to-use-chomp- прежде чем использовать-to-i-or-to-f) »для получения дополнительной информации. –
Спасибо Tin Man, ответ изменился, чтобы удалить chomp. – Rots