我有一個YAML file of groups,我想進入一個MongoDB的集合稱爲組與像{"name" => "golf", "parent" => "sports"}
文件(頂級團體,喜歡運動,也只是{"name" => "sports"}
沒有parent
。)遞歸DFS Ruby的方法
我們試圖traverse the nested hash,但我不確定它是否正常工作。我寧願使用遞歸方法而不是lambda proc。我們應該改變什麼才能使其發揮作用?
謝謝!
馬特
我有一個YAML file of groups,我想進入一個MongoDB的集合稱爲組與像{"name" => "golf", "parent" => "sports"}
文件(頂級團體,喜歡運動,也只是{"name" => "sports"}
沒有parent
。)遞歸DFS Ruby的方法
我們試圖traverse the nested hash,但我不確定它是否正常工作。我寧願使用遞歸方法而不是lambda proc。我們應該改變什麼才能使其發揮作用?
謝謝!
馬特
這裏的工作代碼:
require 'mongo'
require 'yaml'
conn = Mongo::Connection.new
db = conn.db("acani")
interests = db.collection("interests")
@@interest_id = 0
interests_hash = YAML::load_file('interests.yml')
def interests.insert_interest(interest, parent=nil)
interest_id = @@interest_id.to_s(36)
if interest.is_a? String # base case
insert({:_id => interest_id, :n => interest, :p => parent})
@@interest_id += 1
else # it's a hash
interest = interest.first # get key-value pair in hash
interest_name = interest[0]
insert({:_id => interest_id, :n => interest_name, :p => parent})
@@interest_id += 1
interest[1].each do |i|
insert_interest(i, interest_name)
end
end
end
interests.insert_interest interests_hash
查看Interests YAML。
查看acani source。
你的問題就是如何把這段代碼轉換:
insert_enumerable = lambda {|obj, collection|
# obj = {:value => obj} if !obj.kind_of? Enumerable
if(obj.kind_of? Array or obj.kind_of? Hash)
obj.each do |k, v|
v = (v.nil?) ? k : v
insert_enumerable.call({:value => v, :parent => obj}, collection)
end
else
obj = {:value => obj}
end
# collection.insert({name => obj[:value], :parent => obj[:parent]})
pp({name => obj[:value], :parent => obj[:parent]})
}
...使用方法,而不是一個拉姆達?如果是這樣,那麼:
def insert_enumerable(obj, collection)
# obj = {:value => obj} if !obj.kind_of? Enumerable
if(obj.kind_of? Array or obj.kind_of? Hash)
obj.each do |k, v|
v = (v.nil?) ? k : v
insert_enumerable({:value => v, :parent => obj}, collection)
end
else
obj = {:value => obj}
end
# collection.insert({name => obj[:value], :parent => obj[:parent]})
pp({name => obj[:value], :parent => obj[:parent]})
end
如果這不是你要求的,請幫助澄清。
謝謝,但lambda不起作用,所以只是將其轉換爲方法並不能解決核心問題。我的問題是如何讓它工作(最好用一種方法代替lambda)。參見[我的答案](http://stackoverflow.com/questions/4368860/recursive-dfs-ruby-method/4524173#4524173)。 – ma11hew28 2010-12-24 04:27:40
太棒了。 +1 – 2010-12-24 04:34:24