【发布时间】:2015-01-27 17:27:39
【问题描述】:
我喜欢偶尔使用 tap 作为方法返回的美化器。但是,当使用带有递归函数的 tap 时,它的行为与我的预期不同:
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”......因为函数正在递归,它是否会以某种方式污染函数堆栈?
【问题讨论】:
标签: ruby recursion combinators