Рекурсивный метод DFS Ruby
-
09-10-2019 - |
Вопрос
у меня есть YAML-файл групп что я хотел бы попасть в коллекцию MongoDB под названием групп с документами, как {"name" => "golf", "parent" => "sports"}
(Группы высшего уровня, как спорт, просто будут {"name" => "sports"}
без parent
.)
Мы пытаемся Пересекать вложенный хэш, Но я не уверен, правильно ли он работает правильно. Я бы предпочел использовать рекурсивный метод, чем лямбда. Что мы должны изменить, чтобы сделать это работать?
Спасибо!
Матовый
Решение
Вот рабочий код:
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
Просмотреть Интересы Ямл.
Просмотреть Источник Acani.
Другие советы
Ваш вопрос только как конвертировать этот код:
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
Если это не то, что вы спрашиваете, пожалуйста, помогите уточнить.
Не связан с StackOverflow