2013-02-04 224 views
1

在Ruby中,什么是从像一个请求路径构建一个哈希的有效途径:红宝石建筑哈希

/1/resource/23/subresource/34 

到一个哈希看起来像这样:

{'1' => { 'resource' => { '23' => 'subresource' => { '34' => {} } } } 

感谢

+0

看一看这个答案在这里: http://stackoverflow.com/questions/798710/how-to-turn-a-ruby-hash-into-http-params –

+0

为什么会你想这样做?这似乎是一个非常尴尬的方式来引用一条路径。 –

回答

5
path = "/1/resource/23/subresource/34" 
path.scan(/[^\/]+/).inject(hash = {}) { |h,e| h[e] = {} } 

hash 
=> {"1"=>{"resource"=>{"23"=>{"subresource"=>{"34"=>{}}}}}} 
+1

同样,但是如果我们按相反的顺序进行操作:'path.scan(/ [^ \ /] + /)。reverse.inject({}){| h,e | {e => h}}'。可能会更清楚一点,无论如何,这是一条线:它已经返回我们想要的。 – NIA

+0

@NIA - 我喜欢它。这是一个很好的选择。 – Casper

1

递归解决方案似乎是最简单的事情。这是不是最漂亮的,但它的工作原理:

def hashify(string) 
    k,v = string.gsub(/^\//, '').split('/', 2) 
    { k => v.nil? ? {} : hashify(v) } 
end 

有可能是边缘情况下,它不能正确处理(也许是),但它满足你给出的例子。

+0

+1递归! – Hrishi