Ruby, удаление элементов (срезов) из многомерного массива - PullRequest
0 голосов
/ 30 апреля 2020

(Довольно новый с Ruby) Я могу удалить блок элементов из одномерного массива

array1D = Array.new(6){|i| i*i}
array1D.slice!(2,2) #=> [1, 16, 25]
len = array1D.length #=> 4 

Однако,

Array(arrayd3d[0][0]).slice!(30000,8880)

на arrayd3d [1] [1] [38884],

Я все еще получаю

len = array3D.length #=> 38884 

1) Что я делаю не так?

2) Как я могу удалить один и тот же блок элементов (30000,8880) из всех arrayd3d [1..nDim1] [1..nDim2]?

1 Ответ

0 голосов
/ 30 апреля 2020

slice! возвращает удаленный объект:

a = [ "a", "b", "c" ]
a.slice!(1)     #=> "b"
a               #=> ["a", "c"]

Как правило, в ruby мы предпочитаем не изменять исходный объект, если мы не ищем какой-то определенный прирост производительности ( очень очень редко, например, может быть, вы хотите уменьшить потребление памяти очень большого массива, прежде чем двигаться дальше.)

Это причина восклицательного символа (! aka bang), который обычно указывает на некоторые разрушительные поведение.

Пожалуйста, рассмотрите возможность использования версии без взрыва.

Array.new(6){ |i| i*i }
y = array1D.slice(2,2)

or

def some_method(input_array)
  input_array.slice(2,2)
end

x = Array.new(6){ |i| i*i }
y = some_method(x)

Таким образом, ваш код становится более предсказуемым, поскольку вы не изменяете значение своих аргументов.

...