¿Agregar recursivamente cadenas en una matriz juntas? (una función similar a un número triangular con cadenas)

Estoy jugando con un navegador simple de "ruta de navegación" en Rails y quiero dividir mi ruta actual en una serie de cadenas. Sí, sé que hay bibliotecas para esto, pero estoy interesado en cómo realizaría la siguiente tarea en Ruby puro.

Digamos que tiene una cadena de ruta de URL como esta:

/users/admins/1/edit

Y desea devolver una matriz de cadenas como esta:

["/users","/users/admins","users/admins/1","users/admins/1/edit"]

¿Cómo lo harías? He intentado usar el each_index funciones para sumar cada porción subsiguiente y colocarla en una nueva matriz, pero nunca puedo obtener una verdadera adición recursiva de las cadenas.

¿Alguna idea?

preguntado el 09 de marzo de 12 a las 23:03

4 Respuestas

str = "/users/admins/1/edit"
str.split('/').drop(1).reduce([]){|res,s| res << res.last.to_s+'/'+s}
#=> ["/users", "/users/admins", "/users/admins/1", "/users/admins/1/edit"]

Segunda variante inspirada en pguardiario

str.scan(/\/\w*/).reduce([]){|res,s| res << res.last.to_s + s}

respondido 10 mar '12, 08:03

¡Esto es asombroso! Nunca antes había visto el método "reducir". Inteligente como el infierno golpe de pensamiento

No es realmente recursivo, pero hace lo que quiere:

a = '/users/admins/1/edit'.split('/')
a.each_index.map{|i| a[0..i].join('/')}[1..-1]

=> ["/users", "/users/admins", "/users/admins/1", "/users/admins/1/edit"] 

respondido 09 mar '12, 23:03

Una ligera variación: (2 .. a.length).map { |i| a[0,i].join('/') } - mu es demasiado corto

Quizás escanear sea un poco más limpio que dividir:

paths = str.scan /\/\w*/
paths.length.times.map{|i| paths[0..i].join}

respondido 10 mar '12, 04:03

def split_paths(str)
  arr = []
  str.scan('/') {arr << $` unless $`.empty?}
  arr << str
  arr
end

split_paths('/users/admins/1/edit') # => ["/users", "/users/admins", "/users/admins/1", "/users/admins/1/edit"]

respondido 10 mar '12, 00:03

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.