学习札记————运用RubyOnRail代码块,简化代码

在某个项目中,我和同事就某段代码具有相似部分,但单独整理成函数接口,有会增加更多的代码,为了简化代码,技术总监建议使用ruby语言中常用的代码块的方式来简化代码,为此我专门学习了代码块的语法
未更改前的代码
class node
get_nodes(root_id, nodes, level)
                first_node = Node.find(root_id)
                level += 1
                if first_node.nil? or first_node.children.nil?
                        return
                end
                first_node.children.each do |node|
                        nodes << {:node_id =>node.id,:level =>level}
                        get_nodes(node.id, nodes, level)
                end
                nodes
        end
end
本段代码主要作用是遍历结点下所有子结点,并返回包含node_id与层级的level值hash数组,但是同事需返回是整个node里的资料,为此,我们将上段代码做个小小更改
class node
get_nodes(root_id, nodes, level,&block)  <<参数更改
                first_node = Node.find(root_id)
                level += 1
                if first_node.nil? or first_node.children.nil?
                        return
                end
                first_node.children.each do |node|
 更改部分 >>        nodes << yield(node,level)
                        get_nodes(node.id, nodes, level,&block)
                end
               nodes
        end
end
因为本段程序有递归调用,所有在传入参数时候,要加&block,如果不用调用到下一方式,可以不用加&block
而怎么调用这段代码呢?
本列我是在另一个类中调用这段代码
class create_text
Node.new.get_nodes(root.id,Array.new,count = 0){ |node,level|{:node_id =>node.id,:level =>level}}
end
代码块如果带参数可以再||中写入参数,其作用域是在调用函数环境中

本文名称:学习札记————运用RubyOnRail代码块,简化代码
标题来源:http://azwzsj.com/article/jjpded.html