Ruby 红宝石树上的concatAll

Ruby 红宝石树上的concatAll,ruby,string,tree,Ruby,String,Tree,我有两个类:Leaf和BinaryNode 叶包含一个字符串字段 BinaryNode包含两个子节点,它们都是叶节点或BinaryNode 我正在尝试编写一个concatAll方法,它将从左到右返回树中所有单词的字符串 以下是到目前为止我所拥有的,但它只返回它找到的最后一个字符串,而不是已构建的整个字符串。。。为什么 def concatAll final = "" if @lchild.respond_to?('string') final += @lchild.to_s

我有两个类:Leaf和BinaryNode 叶包含一个字符串字段 BinaryNode包含两个子节点,它们都是叶节点或BinaryNode

我正在尝试编写一个concatAll方法,它将从左到右返回树中所有单词的字符串

以下是到目前为止我所拥有的,但它只返回它找到的最后一个字符串,而不是已构建的整个字符串。。。为什么

def concatAll
 final = ""

 if @lchild.respond_to?('string')   
   final += @lchild.to_s
 else
   @lchild.concatAll unless @lchild.nil?
 end

 if @rchild.respond_to?('string')   
   final +=  @rchild.to_s
 else
   @rchild.concatAll unless @rchild.nil?
 end
end

方法的返回值是最后执行的表达式的值。如果没有显式的返回值,您只能得到找到的最后一个字符串

您只需在
结束前添加一行即可:

  final
end

这将返回
final

的值。我发现我需要final+=在递归调用之前返回树

def concatAll
 final = ""

 if @lchild.respond_to?('string')   
    final += @lchild.to_s
 else
   final += @lchild.concatAll unless @lchild.nil?
 end

 if @rchild.respond_to?('string')   
   final +=  @rchild.to_s
 else
   final += @rchild.concatAll unless @rchild.nil?
 end

 final
end

特别感谢Mark Thomas

我认为很奇怪的是,在调用
对其进行
操作之前,您会询问节点是否响应
字符串
。再说一次,我还没有看到你代码的其余部分。是的,很抱歉我应该提到这一点string'只是叶类字符串的访问器方法。所以我问孩子它是否本质上是一片叶子。嗯,也许你可以创建一个
Leaf?
方法,返回true/false。这将使代码非常清晰。这不起作用,但我理解你的意思,重视你的输入。我相信问题在于我递归调用concatAll,但final每次都会重置。。这是否重置了concatAll最终版本的最后一次“迭代”?