Ruby 递归树构建函数只映射到一个子树
我正在尝试递归地构建一棵树。下面的类通过递归调用Ruby 递归树构建函数只映射到一个子树,ruby,recursion,Ruby,Recursion,我正在尝试递归地构建一棵树。下面的类通过递归调用.childrengetter将树构建成散列 class Tree attr_reader :root def initialize(uri:) @root = Article.new(uri: uri) @children = nil end def children(depth: 3, article_children: self.root.child_links) @children ||=
.children
getter将树构建成散列
class Tree
attr_reader :root
def initialize(uri:)
@root = Article.new(uri: uri)
@children = nil
end
def children(depth: 3, article_children: self.root.child_links)
@children ||= article_children.map do |uri|
puts "URI: #{uri}"
if (depth == 0)
return Article.new(uri: uri)
else
article = Article.new(uri: uri)
return { article => self.children(depth: depth - 1, article_children: article.child_links) }
end
end
puts JSON.pretty_generate(@children)
return @children
end
end
我希望生成的JSON看起来像这样:
{
"#<Article:0x00007ff1a33c06d0>": {
"#<Article:0x00007ff1a345e920>": {
"#<Article:0x00007ff1a3989418>": ["#<Article:0x00007ff1a423f698>", ...]
},
"#<Article:0x00007ff1a345e920>": {
"#<Article:0x00007ff1a3989418>": ["#<Article:0x00007ff1a423f698>", ...]
},
"#<Article:0x00007ff1a345e920>": {
"#<Article:0x00007ff1a3989418>": ["#<Article:0x00007ff1a423f698>", ...]
},
"#<Article:0x00007ff1a345e920>": {
"#<Article:0x00007ff1a3989418>": ["#<Article:0x00007ff1a423f698>", ...]
},
"#<Article:0x00007ff1a345e920>": {
"#<Article:0x00007ff1a3989418>": ["#<Article:0x00007ff1a423f698>", ...]
},
}
}
}
{
"#<Article:0x00007ff1a33c06d0>": {
"#<Article:0x00007ff1a345e920>": {
"#<Article:0x00007ff1a3989418>": "#<Article:0x00007ff1a423f698>"
}
}
}
这些URI中的每一个都是每个项目对象的第一个子URI
为什么map只处理第一个元素,而不是整个数组?块中的
return
关键字不仅会结束块,还会结束父函数(在本例中,是def子函数)
因此,您没有按预期返回map
的结果,而是在第一次迭代后返回整个函数。它仍然会触发递归调用,但在每次递归调用中都会发生相同的行为。这就是为什么在结果中看到嵌套,但每个级别只有一个元素,而没有数组
因此,您可以简单地删除return
单词,并保持其他内容不变。请记住,return
无论如何都不是必需的,除非您强制从方法中提前返回
或者,您可以将return
替换为next
,这是可枚举函数中用于下一次迭代的特殊关键字。与return
类似,可以向它传递一个变元,该变元将成为该迭代块的返回值。有关更多信息,请参阅或其他参考资料。如果您要进行接近票数的投票,请留下一个原因,以便我可以改进此问题和未来的问题。为什么您的地图块中有return
s?另外,如果使用同一个@children
实例变量,则外部children
调用的self.children(depth:…)
会有问题吗?@muistooshort除非我错误地在映射
块内显式声明返回,否则返回结果数组。我在这里显式返回是因为我有一个包含多行的映射。return
将结束父函数,而不是块。如果希望迭代继续到下一项,可以将块中的return
替换为next
。@maxpleaner是否要将该注释转换为答案,以便他们可以接受?
URI: https://child.uri.org/example/uri
URI: https://child.uri.org/example/uri1
URI: https://child.uri.org/example/uri2
URI: https://child.uri.org/example/uri3