我有一个我正在开发的 Ruby 应用程序,由于某种原因,当使用包含内部块的递归函数从不同类的函数调用返回值时,它不能按预期工作(在示例代码中更容易看到以下)。奇怪的是,当我创建一个最小样本来尝试找出发生了什么时,该样本按预期工作。例子:
require 'json'
class Simple
attr_accessor :name, :children
def initialize(name,children=nil)
@name = name
@children = children
end
end
a = Simple.new('A')
b = Simple.new('B',[a])
c = Simple.new('C',[b])
d = Simple.new('D')
e = Simple.new('E',[d])
f = Simple.new('F')
g = Simple.new('G',[e,f])
foo = [c,e,g]
def looper(d)
holder = nil
d.each do |item|
# puts item.name
if item.name == 'D'
holder = Simple.new('Z',[])
elsif !item.children.nil?
holder = looper(item.children)
end
end
return holder
end
bar = looper(foo)
puts "Returned from looper: #{bar.name}"
在我的实际代码中,我最终使用类实例变量来获取响应(这也适用于示例代码)。上面的函数示例片段修改为其他模式:
def looper(d)
holder = nil
d.each do |item|
# puts item.name
if item.name == 'D'
@holder = Simple.new('Z',[])
elsif !item.children.nil?
looper(item.children)
end
end
@holder
end
所以我的问题是,使用实例变量是一种好习惯吗?这样做有什么缺点,因为它适用于我的实际代码,而第一个示例模式不适用?