Я не мог понять, почему в Ruby Array#slice
и Array#slice!
ведут себя не так, как Array#sort
и Array#sort!
(так, как один возвращает результаты в новом массиве, а другой работает над текущим объектом).Почему массив # срез и массив # срез! вести себя по-другому?
С sort
первый (без перерыва), возвращает отсортированную копию текущего массива, а sort!
сортирует текущий массив.
slice
, возвращает массив с указанным диапазоном, и slice!
удаляет указанного диапазона от текущего объекта.
По этой причине Array#slice!
ведет себя как это вместо того, чтобы сделать текущий объект массивом с указанным диапазоном?
Пример:
a = [0,1,2,3,4,5,6,7,8,9]
b = a.slice(2,2)
puts "slice:"
puts " a = " + a.inspect
puts " b = " + b.inspect
b = a.slice!(2,2)
puts "slice!:"
puts " a = " + a.inspect
puts " b = " + b.inspect
Выход:
slice:
a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
b = [2, 3]
slice!:
a = [0, 1, 4, 5, 6, 7, 8, 9]
b = [2, 3]
Использование '!'в методе не имеет заданного поведения, он просто указывает, что метод каким-то образом мутирует ввод, а также имеет тот же самый результат. Вы можете добавить его в конец любого метода, который вы пишете. – tpbowden