Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 递归树构建函数只映射到一个子树_Ruby_Recursion - Fatal编程技术网

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