Рекурсивно добавлять строки в массив вместе? (функция типа треугольника со строками) - PullRequest
0 голосов
/ 10 марта 2012

Я играю с простой навигацией "в крошках" в Rails и хочу разделить мой текущий путь на серию строк. Да, я знаю, что для этого есть библиотеки, но мне интересно, как бы вы выполнили следующую задачу в чистом Ruby.

Допустим, у вас есть строка пути URL, как это:

/users/admins/1/edit

И вы хотите вернуть массив строк, например:

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

Как бы вы поступили так? Я пытался использовать функции each_index, чтобы складывать каждую последующую часть вместе и помещать ее в новый массив, но я никогда не смогу получить рекурсивное добавление строк.

Есть идеи?

Ответы [ 4 ]

6 голосов
/ 10 марта 2012
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"]

Второй вариант, вдохновленный pguardiario

str.scan(/\/\w*/).reduce([]){|res,s| res << res.last.to_s + s}
4 голосов
/ 10 марта 2012

Не совсем рекурсивно, но делает то, что вы хотите:

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"] 
2 голосов
/ 10 марта 2012

Может быть, сканирование немного чище, чем сплит:

paths = str.scan /\/\w*/
paths.length.times.map{|i| paths[0..i].join}
1 голос
/ 10 марта 2012
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"]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...