Различия в цикличном выполнении в Ruby с помощью Диапазона по сравнению с Временами

Я пытаюсь решить 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
26
задан 28 May 2010 в 03:29
поделиться

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.

9
ответ дан 28 November 2019 в 17:27
поделиться

Если я вас правильно понял, вы спрашиваете, почему 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 раз.

4
ответ дан 28 November 2019 в 17:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: