Я пытаюсь решить Euler проблему Проекта с помощью Ruby, я использовал 4 различных метода цикличного выполнения, для цикла, времена, диапазон и до метода, однако метод времен только производит ожидаемый ответ, в то время как для цикла, диапазон и до метода не делают. Я предполагаю, что они - несколько то же, но я узнал, что это не. Кто-то может объяснить различия между этими методами?
Вот структура цикличного выполнения, которую я использовал
# 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
Эту информацию можно легко получить, изучив документацию.
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.
Если я вас правильно понял, вы спрашиваете, почему n.times
- единственный метод, который повторяется до, но не включает n
. В этом случае:
Для диапазонов это просто: x..y
определяет диапазон от x до y включительно, а x ... y
определяет диапазон от x до y без включения . Поэтому, если вы хотите, чтобы поведение было таким же, как и во времени, используйте 0 ... n
.
Для x.upto (y)
существует только одна версия, которая будет повторяться вплоть до y
. Это просто то, как upto определяется и документируется для работы.
Также совершенно ясно, почему n ×
не включает n: если он повторяется от 0 до n (включительно), это даст n + 1
раз. Но поскольку метод называется n ×
, очевидно, что он должен давать только n раз.