Различия в циклах в Ruby с использованием диапазона и времени

Я пытаюсь решить проблему Project Euler с помощью Ruby, я использовал 4 разных метода циклов: цикл for, times, range и upto, однако метод times дает только ожидаемый ответ, а цикл for, диапазон и до метода нет. Я предполагаю, что они несколько одинаковы, но я обнаружил, что это не так. Может кто-нибудь объяснить разницу между этими методами?

Вот структура цикла, которую я использовал

# for-loop method
for n in 0..1
  puts n
end

0
1
=> 0..1

# times method
2.times do |n|
  puts n
end

0
1
=> 2

# range method
(0..1).each do |n|
  puts n
end

0
1
=> 0..1

# upto method
0.upto(1) do |n|
  puts n
end

0
1
=> 0

person Community    schedule 28.05.2010    source источник


Ответы (2)


Эту информацию можно легко получить, изучив документацию.

Array#each имеет подпись array.each {|item| block } → array, поэтому мы видим, что возвращаемое значение foo.each { ... } равно foo.

Аналогично, Int#upto имеет подпись int.upto(limit) {|i| block } => int, так что x.upto(y) { ... } будет всегда возвращайте x.

Затем мы также видим, что 2.times { ... } вернет 2 из-за Integer#times. подпись.

У меня возникли проблемы с поиском нужной документации, но for x in y... переводится в y.each do |x| ..., поэтому ваш цикл for-in возвращает то же самое, что и ваш цикл .each.

В любом случае, зависимость от значений return этих циклических конструкций... странный подход. Я не думаю, что это происходит часто (вообще?) в идиоматическом коде Ruby.

person Mark Rushakoff    schedule 28.05.2010
comment
Мне не кажется, что он спрашивает о возвращаемом значении. - person sepp2k; 28.05.2010
comment
@ sepp2k: я видел, что вывод каждого оператора был 0 1, а возвращаемые значения, указанные =>, имели 3 разных значения. В любом случае вопрос можно было бы сформулировать более четко. - person Mark Rushakoff; 28.05.2010
comment
Я думаю, что ОП неправильно понимает, что => выводится IRB, думая, что это нормальная часть закодированного вывода цикла. - person the Tin Man; 09.12.2010

Если я вас правильно понял, вы спрашиваете, почему n.times - единственный метод, который повторяется до, но не включает n. В этом случае:

Для диапазонов все просто: x..y определяет диапазон от x до y включительно, а x...y определяет диапазон от x до y без учета. Поэтому, если вы хотите, чтобы поведение было таким же, используйте 0...n.

Для x.upto(y) существует только одна версия, которая будет повторяться до y включительно. Это просто то, как upto определяется и документируется для работы.

Также совершенно ясно, почему n.times не включает n: если бы он повторялся от 0 до n (включительно), он дал бы n+1 раз. Но поскольку метод называется n.times, он явно должен возвращать только n раз.

person sepp2k    schedule 28.05.2010