Я пытаюсь решить проблему 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
Ответ 1 · рейтинг 9 · Mark Rushakoff
Эту информацию можно легко получить, изучив документацию.
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.
Ответ 2 · рейтинг 4 · sepp2k
Если я вас правильно понял, вы спрашиваете, почему 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 раз.