Estaba buscando un equivalente de matriz String#split
en Ruby Core, y me sorprendió descubrir que no existía. ¿Hay una manera más elegante que la siguiente para dividir una matriz en sub-arrays en función de un valor?Divide el arreglo en sub-arrays basado en el valor
class Array
def split(split_on=nil)
inject([[]]) do |a,v|
a.tap{
if block_given? ? yield(v) : v==split_on
a << []
else
a.last << v
end
}
end.tap{ |a| a.pop if a.last.empty? }
end
end
p (1..9).to_a.split{ |i| i%3==0 },
(1..10).to_a.split{ |i| i%3==0 }
#=> [[1, 2], [4, 5], [7, 8]]
#=> [[1, 2], [4, 5], [7, 8], [10]]
Editar: Para los interesados, el problema del "mundo real", que dio pie a esta petición se puede ver en this answer, donde yo he usado @ respuesta de fd a continuación para la aplicación.
Bueno, en Python que podría convertirla en una cadena (valores separados por comas o algo así), que divide, y luego volver a una lista. No sé si esa es una opción en Ruby. –
@Rafe Sería, pero solo si los contenidos fueran solo cadenas. Incluso entonces, eso difícilmente podría considerarse elegante. : p – Phrogz
@Phrogz si fueran números, funcionaría bien también. Simplemente harías '','. Join ([str (x) para x en list_of_nums])', luego dividir en lo que sea, luego volver a unir y dividir en comas. Funcional, sí, elegante, eh no. –