Циклические различия в Ruby с использованием Range против Times - PullRequest
22 голосов
/ 28 мая 2010

Я пытаюсь решить проблему 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

Ответы [ 2 ]

8 голосов
/ 28 мая 2010

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

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 возвращает то же самое, что и цикл .each.

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

3 голосов
/ 28 мая 2010

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...