Пример массива,
# sub-arrays are all of the same length arr = [[1,2,3,4], [5,6,7,8], [2,4,6,8], [1,3,5,7]]
Теперь
arr.some_slicing_technique(0..2)
должен дать мне,
[[1,2,3], [5,6,7], [2,4,6], [1,3,5]]
some_slicing_technique существует? Как лучше всего это решить?
some_slicing_technique
Вы можете сделать это так:
[[1,2,3,4], [5,6,7,8], [2,4,6,8], [1,3,5,7]].map {|e| e.take(3)} => [[1, 2, 3], [5, 6, 7], [2, 4, 6], [1, 3, 5]]
Или, если вы хотите использовать диапазоны:
[[1,2,3,4], [5,6,7,8], [2,4,6,8], [1,3,5,7]].map {|e| e[0..2]}
Вы можете транспонировать исходный массив, удалить последний блок и снова транспонировать его:
arr.transpose[0..2].transpose
Немного более обобщенно:
arr = [[1,2,3,4], [5,6,7,8], [2,4,6,8], [1,3,5,7]] slice_lambda = lambda { |r| lambda{ |x| x[r]} } arr.map(&slice_lambda[0..2]) # => [[1, 2, 3], [5, 6, 7], [2, 4, 6], [1, 3, 5]] arr.map(&slice_lambda[1..2]) # => [[2, 3], [6, 7], [4, 6], [3, 5]]