0

メソッドの戻り値を美しくするために、時々タップを使用するのが好きです。ただし、再帰関数でタップを使用すると、動作が予想とは異なります。

class Node
  attr_accessor :name, :children

  def initialize(name); self.name, self.children = name, []; end

  def render
    res = "Name: #{name}\n"
    children.each do |child|
      res += " - " + child.render + "\n"
    end
    res
  end
end

parent = Node.new('Parent')
parent.children = [Node.new('Child')]
puts parent.render

戻り値

Name: Parent
 - Name: Child

タップを使用するようにレンダリング関数を変更すると:

  def render
    "Name: #{name}\n".tap do |res|
      children.each do |child|
        res += " - " + child.render + "\n"
      end
    end
  end

戻る

Name: Parent

動作は最初のレンダリング関数と同じであると思います。ドキュメントは、「ブロックにxを生成し、xを返す」ことを示しています...関数が再帰的であるため、何らかの形で関数スタックを汚染していますか?

4

1 に答える 1