`

在 Ruby 中对树状结构(tree)进行 map 操作

    博客分类:
  • Ruby
阅读更多
class BookChapter < ActiveRecord::Base
  belongs_to :parent, :class_name => 'BookChapter', :foreign_key => 'parent_id'

  has_many :children, 
    :class_name => 'BookChapter', 
    :foreign_key => 'parent_id',
    :order => 'play_order'

  def map(parent_mapping=nil, &block)
    result = block.call self, parent_mapping
    children.each do |chapter|
      chapter.map result, &block
    end
    result
  end

end


usage:

class EpubChapter
  attr_accessor :title
  def initialize
    @children = []
  end

  def add_child(child)
    @children << child
  end
end

book_chapter = BookChapter.first
book_chapter.map do |chapter, parent|
  # 这里处理父子关系,例如:
  child = EpubChapter.new
  child.title = chapter.title
  parent.add_child child if parent
  child
end


这是改进过之后的版本了,之前一个版本使用简单些,但是有接口上的双向依赖,就不贴出来了。

然后呢,还可以把这个方法抽出来,放到 module 中,这样就可以到处使用了:
module MappableTree
  def map(parent_mapping=nil, &block)
    result = block.call self, parent_mapping
    children.each do |child|
      child.map result, &block
    end
    result
  end
end

class Nokogiri::XML::Node
  include MappableTree
end


还有点味道,这个 map 方法要求实现类必须有一个 children 方法,而且这个 children 方法的返回值还必须有一个 each 方法,稍微封装一下,变成:
module MappableTree
  def map(parent_mapping=nil, &block)
    result = block.call self, parent_mapping
    each_child do |child|
      child.map result, &block
    end
    result
  end
end

class Nokogiri::XML::Node
  include MappableTree
  def each_child &block
    children.each &block
  end
end

这样耦合就不那么紧了。
分享到:
评论
1 楼 Hooopo 2012-07-31  
一般实现map都先实现each

相关推荐

    Ruby Mind Map

    打开这个文件,用户可以查看其结构和样式,了解如何在实际操作中使用 Ruby Mind Map。 总结来说,Ruby Mind Map 是一款基于 Ruby 语言的开源思维导图工具,提供丰富的自定义选项和交互操作,有助于用户高效地整理和...

    Ruby-Ancestry将ActiveRecord模型组织成一个树状结构

    Ruby-Ancestry是一个非常有用的库,它允许开发者在ActiveRecord模型中构建和管理层次结构,形成树状结构。这个库特别适用于那些需要处理有层级关系数据的场景,比如分类、菜单系统、组织架构等。Ancestry通过提供一...

    ruby对excel的操作 详细操作

    在Ruby中操作Excel文件主要是通过`win32ole`库来实现的,这个库允许Ruby程序与Windows操作系统中的Office应用程序进行交互,如Microsoft Excel。以下是关于如何使用Ruby操作Excel的详细步骤和知识点: 1. **引入win...

    ruby文件操作,简单ppt

    在 Ruby 编程语言中,对文件进行操作是非常常见的需求之一,无论是简单的文件读写还是复杂的文件管理任务,都需要对 Ruby 的文件处理机制有一定的了解。本篇将详细介绍 Ruby 中如何进行文件操作,包括但不限于文件的...

    ruby中英文api

    "ruby中英文api"资料集可能包含了对这些内容的解释,无论是对于初学者还是有经验的开发者,都是宝贵的参考资料。 "ruby中文文档.chm"可能是Ruby的中文版官方文档,这对于中文环境下的学习者来说非常方便。它可能...

    Ruby-RGL在Ruby中图形数据结构和算法的框架

    Ruby-RGL是一个强大的开源库,专门用于在Ruby编程语言中实现图形数据结构和算法。这个框架为Ruby开发者提供了一系列工具,使他们能够处理复杂的图论问题,进行网络分析,以及进行科学计算和分析。RGL全称为“Ruby ...

    Ruby Data-Processing ruby数据处理

    Map、Reduce和Select是Ruby中用于操作和处理数据的关键概念,它们在数据科学、分析和软件工程领域中扮演着重要角色。 1. **Ruby Map**: Map函数允许我们将一个操作应用到数组或集合中的每一个元素上,然后返回一个...

    Ruby-Watir在Ruby中Web应用程序测试

    Ruby-Watir是一种开源自动化测试框架,专门用于在Ruby编程语言中进行Web应用程序的测试。它允许开发者通过编写Ruby代码来模拟用户与浏览器的交互,从而实现端到端的测试。这个工具的名字“Watir”是“Web ...

    ruby中文教程,从基础到深入的让你学习ruby

    Ruby提供了许多工具来进行元编程,如`eval`函数可以执行字符串中的代码,`class_eval`和`instance_eval`允许在运行时修改类或对象的行为。此外,Ruby的`send`方法可以动态调用方法,`method_missing`可以捕获未定义...

    ruby on rails对mongodb的操作

    本文将深入探讨如何在Ruby on Rails中集成并操作MongoDB。 首先,我们需要安装必要的库。MongoDB的Ruby驱动程序是`mongo` gem,而`mongoid`或`mongo_mapper`是两个流行的ORM(对象关系映射)工具,它们允许我们用...

    ruby 中文文档 必备资料

    在Ruby中,异常类是继承自`StandardError`的,你可以自定义异常类来处理特定类型的错误。 Ruby on Rails是Ruby最著名的Web开发框架,它遵循MVC(模型-视图-控制器)架构模式。这份文档可能也涵盖了Rails的相关内容...

    Ruby-MongoidTreeMongoid文档树结构使用物化路径模式

    Ruby-MongoidTree是一个用于Mongoid ORM的插件,它允许你在MongoDB数据库中创建和操作树形结构的数据。Mongoid Tree是基于物化路径模式实现的,这是一种在非关系型数据库中构建层级数据的方法。在此模式下,每个文档...

    ruby中文文档中心资料

    在Ruby中,Web开发最知名的框架是Ruby on Rails,它遵循MVC(模型-视图-控制器)架构模式,简化了Web应用的开发。Rails提供了许多约定优于配置的特性,使得开发者可以更快速地构建功能丰富的网站。 总结起来,"ruby...

    ruby操作flash窗口

    在给定的场景中,"ruby操作flash窗口"主要涉及的是通过Ruby的Selenium WebDriver库来实现对Flash内容的自动化测试。Selenium WebDriver是一个强大的自动化测试工具,它允许我们控制浏览器并模拟用户行为,从而测试...

    ruby中文文档.chm

    在Ruby中,一切都是对象,包括基本的数据类型如字符串、数字和布尔值。这种特性使得Ruby在处理复杂问题时具有很高的灵活性。文档中将详细讲解Ruby的基础语法,如变量声明、控制结构(条件语句、循环)、函数和方法...

    ruby中文手册 chm

    用户指南通常会从基础开始介绍Ruby,包括变量、数据类型、控制结构(如if语句、循环)、函数、类与对象、模块、继承等。此外,还会涉及异常处理、文件操作、正则表达式和字符串处理等内容,这些都是Ruby编程的基础...

    Ruby-qtbindings允许你在Ruby中使用QTGui工具包

    在Ruby中使用QTGui工具包,开发者可以利用Ruby的简洁语法和动态特性,同时享受到QT提供的强大GUI设计能力。通过qtbindings,Ruby程序员可以直接调用QT的类和方法,创建复杂的窗口应用、控件、布局和信号与槽机制,而...

    在Ruby中处理XML和XSLT以及XPath的简单教程

    在当前IT行业的发展中,处理XML和XSLT以及XPath是数据交互和文本处理的基本技能,尤其在使用Ruby语言进行Web开发,比如Ruby on Rails框架时,掌握这些技能对于处理后端数据和前端展示至关重要。本篇教程将介绍如何在...

    Ruby-ClosureTree轻松高效地使你的ActiveRecord模型支持层次结构

    在这个例子中,`has_closure_tree`定义了一个树状结构,并指定了排序字段`name`。之后,你可以像操作普通模型一样创建和更新节点,Closure Tree会自动维护其层次关系。 Closure Tree提供了许多有用的方法,如: 1....

Global site tag (gtag.js) - Google Analytics