#ruby-on-rails #ruby
#ruby-on-rails #ruby
Вопрос:
Существует ли метод ruby, который будет циклически перемещать каждый элемент в массиве вправо на определенное число?
Например, если он принимает массив [1,2,3,4] и номер сдвига 1, возвращает [4,1,2,3] .
Или, если он принимает массив [1,2,3,4,5] и номер сдвига 2, возвращает [4,5,1,2,3] .
Я мог бы сам создать этот метод, но у ruby обычно уже есть метод для такого рода вещей. У меня возникли проблемы с его поиском, поскольку я не знаю, как он будет называться. Методы array cycle
и shift
не имеют такого поведения.
Комментарии:
1. Если вы просматривали
Array
методы, прежде чем задавать вопрос, разве вам не было интересно узнать о том, который называется «повернуть»?
Ответ №1:
Вы можете использовать rotate
метод, который выполняет аналогичные действия
2.6.5 :012 > arr = [1,2,3,4]
=> [1, 2, 3, 4]
2.6.5 :013 > arr.rotate
=> [2, 3, 4, 1]
2.6.5 :014 > arr = [1,2,3,4,5]
=> [1, 2, 3, 4, 5]
2.6.5 :015 > arr.rotate(2)
=> [3, 4, 5, 1, 2]
Например :-
2.6.5 :021 > def array_rotation(array, shift = 1)
2.6.5 :022?> array.rotate(- shift)
2.6.5 :023?> end
=> :array_rotation
2.6.5 :024 > arr = [1,2,3,4,5]
=> [1, 2, 3, 4, 5]
2.6.5 :025 > array_rotation arr, 2
=> [4, 5, 1, 2, 3]
2.6.5 :026 > arr = [1,2,3,4]
=> [1, 2, 3, 4]
2.6.5 :027 > array_rotation arr, 1
=> [4, 1, 2, 3]
Комментарии:
1. На мой взгляд, нет причин создавать новый метод только для того, чтобы перевернуть целое число с положительного на отрицательное. Я бы использовал
array.rotate(-n)
, гдеarray
это массив иn
количество элементов для поворота назад.2. @3limin4t0r : Полностью согласен. Добавлен метод только для удовлетворения заданных условий.
3. Вопрос не требует создания метода. Фактически, OP хочет использовать существующий метод, если он есть. Учитывая, что вы «полностью согласны» с @3limin4t0r, я предлагаю вам отредактировать свой ответ и просто указать, что существует такой метод :
Array#rotate
. В редактировании нет необходимости упоминать, что это редактирование. Если вы хотите поблагодарить кого-то за предложение, я предлагаю вам сделать это в комментарии, а не в ответе, чтобы сохранить последнее «чистым».
Ответ №2:
Комментарии:
1. Спасибо, именно то, что я ищу!
2.
shift_rotate([1,2,3,4,5], 2) #=> [3, 4, 5, 1, 2]
, нет[4, 5, 1, 2, 3]
. Было бы проще написатьarray.rotate(-shift)
. На самом деле, зачем вообще создавать методshift_rotate
, а не просто писатьarray.rotate(-shift)
?3. @CarySwoveland Я согласен с вами,
array.rotate(-shift)
но я не уверен, почему вы получаете другой результат, чем я, от этого метода, могу я попросить вас поделиться своей версией Ruby?4. @CarySwoveland
shift_rotate([1,2,3,4,5], 2) #=> [3, 4, 5, 1, 2]
в случае, если вы напишете: `array.rotate (shift — array.size)` это не то же самое, что я сделал 🙂5. Мой плохой, или это я плохой? Вычеркните первое предложение моего первого комментария.