2013-09-14 4 views
1

Я делаю пример Криса Пайн Вип-Год. Вопрос заключается в написании метода, который расскажет вам все високосные годы в течение нескольких лет. Вы запрашиваете у пользователя начальный год и год окончания.Переменная область Confusion

Глядя на поставленном ответ, я запутался о том, как year переменных является выбираемыми в while заявления также добавляются к заявлению puts "Check it out...these years are leap years:". Я понимаю петлю while. Я не вижу, как каждый год или результат отображается пользователю. Не является ли переменная year в операторе while в объеме, отличном от объема year в заявлении puts?

def leap_years 
    puts "Starting Year?" 
    start = gets.chomp.to_i 

    puts "Ending Year?" 
    ending = gets.chomp .to_i 

    puts "Check it out...these years are leap years:" 
    year = start #year is now = to the start, but how is it getting fed each year from the while loop? 

while year <= ending 
    if year%4 == 0 
     if year%100 != 0 || year%400 == 0 
     puts year 
     end 
    end 
    year = year + 1 
    end 

end 
+0

Нет, они являются одной и той же переменной. Очевидно, как выводится вывод. – Abizern

+0

Спасибо Abizern. Я вижу, что это как-то одна и та же переменная. Я пытаюсь понять, как каждый действительный год в цикле while печатается в последнем объявлении puts? – HelloWorld

+1

Распечатайте инструкцию, возьмите карандаш и следуйте по пути кода при изменении переменной, это должно стать ясным для вас. – Abizern

ответ

1
  • puts "Check it out...these years are leap years:" только печать начального сообщения, прежде чем он идет в петлю. Он не печатает ни одного года.
  • year = start инициализирует переменную year прежде, чем она войдет в цикл.
  • Печать каждый год осуществляется по линии puts year внутри if петли внутри другого if цикла внутри цикла while, и цикл while внутри рамки переменной year, и доступ к нему.

Кстати, предоставленный ответ, который вы цитируете, не выглядит красивым. Очиститель решение выглядит следующим образом:

class Fixnum 
    def leap_year? 
    return true if modulo(400).zero? 
    return false if modulo(100).zero? 
    return true if modulo(4).zero? 
    return false 
    end 
end 

puts (start..ending).select(&:leap_year?) 

Или, более эффективно:

(start..ending).each{|i| puts i if i.leap_year?} 
1

Я думаю, что ключ здесь в состоянии понять две вещи ... рамки Ruby, и эта линия: year = year + 1

Если концепция сферы неясна, я бы порекомендовал немного поискать в Google. «Рубиновый прицел» станет хорошим началом.

Вот как я думаю об этом:

Say start является 1, так, то мы создаем новую переменную с именем year и положим, что равное start. Так year содержит 1.

область, которую year живет в том, что функции leap_years так все остальное в leap_years, что приходит после объявления year может изменить то, что year содержит.

Теперь это цикл while. Этот цикл while работает в той же области, что и year, как и все, что находится внутри цикла while.

Итак, вы начинаете проходить через цикл, и вы добираетесь до линии year = year + 1. Я помню, что такое понятие действительно сбивало меня с толку, когда я начал программировать. Если год равен 1, я бы прочитал это как «1 = 1 + 1», что является бессмыслицей.

Теперь я думаю о такой линии, как ...

Set our already-existing variable year equal to the current value of year + 1

Так, если год = 1 на первой итерации год теперь содержит 2.

В следующий раз мы управляем через итерации, так как вся leap_years функция может ссылаться на year, в то время как год петлевой будет содержать 2, и если условия будут выполнены, год будет напечатан на экране. year = year + 1 будет выполняться еще раз, а year будет содержать 3. Все до года содержит то же значение, что и в конце, в течение которого цикл while останавливается.

Смежные вопросы