递归地将数组中的字符串一起添加? (带字符串的三角形数字函数)

时间:2012-03-09 23:39:42

标签: ruby arrays string

我在Rails中使用简单的“breadcrumb”导航,我想将当前路径分成一系列字符串。是的我知道有这样的库,但是我对如何在纯Ruby中完成以下任务感兴趣。

假设你有一个像这样的url路径字符串:

/users/admins/1/edit

你想要返回一个像这样的字符串数组:

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

你会怎么做?我已经尝试使用each_index函数将每个后续部分添加到一起并将其推入一个新数组中,但我永远无法获得字符串的真正递归添加。

有什么想法吗?

4 个答案:

答案 0 :(得分:6)

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}

答案 1 :(得分:4)

不是真的递归,而是做你想要的:

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 :(得分:2)

也许扫描比分裂更清洁:

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

答案 3 :(得分:1)

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"]