Объявление целочисленного Диапазона с шагом! = 1 в Ruby

ОБНОВЛЕНИЕ 2: Для потомства это - то, как я обосновался на выполнении его (благодаря входу Jorg):

100.step(2, -2) do |x|
    # my code
end

(Очевидно, существует много способов сделать это; но это кажется, что это - большая часть "Ruby" способ сделать это; и это точно, чем я был после.)


ОБНОВЛЕНИЕ: хорошо, поэтому то, что я искал, было step:

(2..100).step(2) do |x|
    # my code
end

Но оказывается, что я не был 100%-м приближением в своем исходном вопросе. Я на самом деле хочу выполнить итерации по этому диапазону назад. К моему удивлению отрицательный шаг не законен.

(100..2).step(-2) do |x|
    # ArgumentError: step can't be negative
end

Так: как я делаю это назад?


Эй парни, я абсолютно плохо знаком с Ruby, так быть нежным.

Скажите, что я хочу выполнить итерации по диапазону четных чисел от 2 до 100; как я сделал бы это?

Очевидно, я мог сделать:

(2..100).each do |x|
    if x % 2 == 0
        # my code
    end
end

Но, очевидно (снова), который был бы довольно глуп.

Я знаю, что мог сделать что-то как:

i = 2
while i <= 100
    # my code
    i += 2
end

Я полагаю, что мог также записать свой собственный класс, который обеспечивает его собственное each метод (?). Я почти уверен, что это было бы излишеством, все же.

Я интересуюсь двумя вещами:

  1. Действительно ли возможно сделать это с некоторым изменением стандартного синтаксиса Диапазона (т.е. (x..y).each)?
  2. Так или иначе, каков был бы самый идиоматический "Ruby способ" выполнения этого (использование Диапазона или иначе)? Как я сказал, я плохо знаком с языком; так любое руководство можно предложить о том, как сделать, вещи в более типичном стиле Ruby очень ценились бы.
15
задан Martijn Pieters 3 June 2013 в 06:03
поделиться

2 ответа

Вы не можете объявить Диапазон с "шагом". У диапазонов нет шагов, у них просто есть начало и конец.

Вы, конечно, можете итерировать по Range с шагом, например, так:

(2..100).step(2).reverse_each(&method(:p))

Но если вы хотите только итерировать, то для чего вам вообще нужен Range? Почему бы просто не выполнить итерацию?

100.step(2, -2, &method(:p))

Преимущество этого метода в том, что в отличие от reverse_each ему не нужно генерировать промежуточный массив.

24
ответ дан 1 December 2019 в 02:28
поделиться

Этот вопрос отвечает на ваш: о диапазоне рубинов?

(2..100).step(2) do |x|
    # your code
end
3
ответ дан 1 December 2019 в 02:28
поделиться
Другие вопросы по тегам:

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