メソッドの戻り値を美しくするために、時々タップを使用するのが好きです。ただし、再帰関数でタップを使用すると、動作が予想とは異なります。
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を返す」ことを示しています...関数が再帰的であるため、何らかの形で関数スタックを汚染していますか?