`
robbin
  • 浏览: 4821078 次
  • 性别: Icon_minigender_1
  • 来自: 上海
博客专栏
377a9ecd-1ea1-34ac-9530-9daa53bb2a7b
robbin谈管理
浏览量:137032
社区版块
存档分类
最新评论

领略一下ruby的DSL能力

    博客分类:
  • Ruby
阅读更多
在rails里面,我们可以用很方便的声明方式来定义model之间的关联关系,例如:

class Topic < ActiveRecord::Base
  has_many :posts
  belongs_to :user
end


那has_many和belongs_to究竟是什么东西呢?其实他们是Topic类的class method,标准写法是:

class Topic < ActiveRecord::Base
  Topic.has_many(:posts)
  Topic.belongs_to(:user)
end


那么has_many可以给我们带来什么呢?类方法has_many在被执行的时候,给Topic的对象实例添加了一系列方法:posts, posts<<, orders.push......等等。所以当我们在model里面声明has_many,belongs_to等对象关系的时候,一系列相关的对象方法就被自动添加进来了。

既然明白了rails的小把戏,让我们来自己试试看吧:
module M
  def self.included(c)
    c.extend(G)
  end
  module G
    def generate_method(*args)
      args.each do |method_name|
        define_method(method_name) { puts method_name }
      end
    end
end
end

class C
  include M
  generate_method :method1, :method2
end

c = C.new
c.method1
c.method2



我们定义了一个声明generate_method,可以接受多个symbol,来动态的创建同名的方法。现在我们在类C里面使用这个声明:generate_method :method1, :method2,当然我们需要include模块M。为什么rails的model不需要include相关的模块呢?当然是因为Topic的父类ActiveRecord::Base已经include了模块Associations了。

类C通过include模块M,调用了模块M的一个included回调接口,让类C去extend模块G,换句话来说就是,通过include模块M,来给类C动态添加一个类方法generate_method。

这个generate_method被定义在模块G当中,它接受一系列参数,来动态创建相关的方法。于是我们就实现了这样的DSL功能:

通过在类C里面声明generate_method :method1, :method2,让类C动态的添加了两个实例方法method1,method2,是不是很有意思?

实际上rails的对象关联声明也是以同样的方式实现的。
分享到:
评论
7 楼 zlxym 2007-06-25  
请Robbin解释一下,这两行方法在什么时候执行啊?搞不太懂耶。
6 楼 cfc 2007-06-17  
lzqjj 写道
好像楼上的并没有回答我的问题咧?


To lzqjj:
這個嘛.. 事實上看看ActiveRecord的源代碼即可明瞭:)
5 楼 云上的日子 2007-06-14  
请问robbin先生,您用的是什么文本编辑器,我也想用:)
看着挺舒服的。
4 楼 lzqjj 2007-06-05  
好像楼上的并没有回答我的问题咧?
3 楼 intelligent114 2007-06-03  
看看rails的源代码,
其中大量用到了method_missing
然后将params传到一个method generator函数中

动态地分析是否可以添加/定义这个函数

很powerful

不过,也使得代码不好读,太动态了

浅见
2 楼 lzqjj 2007-06-01  
请问robbin:
Topic.has_many(:posts)  
Topic.belongs_to(:user)
这两个类方法(以及其它类似的方法)是在什么地方定义的??
1 楼 melin 2007-05-09  
看了以后很有帮助!

相关推荐

    Programming ruby.pdf

    《Programming Ruby》是一本关于Ruby编程语言的经典著作,由Dave Thomas、Andy Hunt和Chad Fowler合著。...通过深入阅读和实践,你将能够熟练地运用Ruby进行各种开发工作,并领略到Ruby优雅而强大的编程哲学。

    《Ruby Programming—向Ruby之父学程序设计(第2版)》电子书

    Ruby编程语言是由Yukihiro Matsumoto(又称为Matz)创建的一种面向对象的语言,它以其简洁、优雅的语法和强大的功能而...通过深入阅读和实践,你将能够领略到Ruby语言的魅力,并具备使用Ruby进行实际项目开发的能力。

    ruby实战书、代码书.rar

    Ruby是一种面向对象的编程语言,以其简洁、优雅的语法和强大的元编程能力而闻名。这本书籍集合包含了两本关于Ruby的实用书籍——...通过阅读和实践书中的例子,你将能更好地领略到Ruby的魅力,提升自己的编程技能。

    《Ruby用户指南》中文版

    Ruby以其简洁、优雅的语法和强大的元编程能力著称,是许多开发者首选的脚本语言。本书将带你走进Ruby的世界,探索其核心概念和常用库,助你在实践中提升编程技能。 Ruby语言的基础部分包括变量、常量、数据类型(如...

    ruby 快速开发web项目的教程

    Ruby是一种面向对象的、动态...通过深入学习Ruby语言和Rails框架,初学者不仅可以提升编程技能,还能领略到敏捷开发的魅力。本教程的PDF文档《rubyonrails.pdf》将详细讲解这些概念和实践,是初学者入门的理想资源。

    ruby基础教程中文第四版

    Ruby是一种面向对象的、动态类型的编程语言,由日本的松本行弘(Yukihiro Matsumoto)创立,因...通过学习,不仅可以了解Ruby的基本语法,还能领略到其设计理念,为后续的Web开发、自动化脚本编写等应用打下坚实的基础。

    ruby资源推荐.docx

    - **简介**:本书以一种轻松愉快的方式介绍了Ruby语言的各种特性,作者David Black以其丰富的经验带领读者领略Ruby的魅力。 - **适合人群**:适合希望通过实践快速掌握Ruby语言特性的学习者。 #### 二、Ruby 学习...

    Ruby最简单的初级教程

    Ruby是一种面向对象的、动态类型的编程语言,以其简洁、优雅的语法和强大的元编程能力而闻名。本初级教程旨在为初学者提供一个易懂且全面的Ruby学习路径,让大家能够快速掌握这门语言的基础知识。 一、Ruby简介 ...

    Ruby之路

    通过阅读《Addison-Wesley.The.Ruby.Way.2nd.Edition.Oct.2006.chm》这本书,开发者不仅能掌握Ruby语言的基本语法,还能领略到Ruby的灵活性和创造性,从而更好地利用Ruby解决实际问题。这本书是Ruby初学者和进阶者的...

    Ruby 从入门到精通

    Ruby由日本人松本行弘(Yukihiro Matsumoto)在1990年代创建,设计目标是结合Smalltalk的面向对象特性、Perl的文本处理能力和Lisp的函数式编程。Ruby的最大特点是其纯面向对象,意味着所有数据,包括基本类型如整数...

    ruby入门

    1. 面向对象:Ruby的万物皆对象,就连基本的数据类型如整数、字符串和布尔值都是对象,具有方法调用的能力。 2. 动态类型:无需预先声明变量类型,Ruby会自动根据赋值确定变量类型。 3. 自动内存管理:Ruby采用垃圾...

    Raven

    总的来说,《Raven:使用Ruby脚本构建Java项目》是针对Java开发者的一份宝贵资源,它将帮助你提升构建自动化水平,使开发流程更加高效,同时也能让你领略到Ruby语言的魅力。通过学习和应用书中的知识,你将能够利用...

    <<Ruby for Rails中文版>>源代码

    通过阅读和分析这些源代码,你可以更深入地理解Rails的工作原理,提升实际开发技能,并领略Ruby on Rails的魅力。在学习过程中,不断实践和调试代码,将理论知识与实际应用相结合,是掌握这门技术的关键。

    中文版的Ruby On Rails实践(PDF)

    Ruby on Rails,简称Rails,是由David Heinemeier Hansson基于Ruby语言开发的一个开源Web应用程序框架,它遵循MVC(Model-View-Controller)架构模式,旨在简化Web应用开发过程,提高开发效率。这个中文版的《Ruby ...

    kotlin-dsl-gradle-sample:关于kotlin dsl gradle样本

    通过学习和实践"kotlin-dsl-gradle-sample"项目,开发者不仅能掌握Kotlin DSL的基本用法,还能领略到其在提升构建脚本质量方面的巨大潜力。在实际开发中,运用Kotlin DSL可以显著提高工作效率,减少维护成本,让构建...

    Head-First-Ruby:学习“ Ruby”语言

    本教程将带你一步步走进Ruby的世界,领略其魅力。 在Ruby中,一切都是对象,包括基本的数据类型如整数、字符串和布尔值。这种设计使得编程更加灵活,可以方便地进行面向对象编程。Ruby提供了丰富的内置类和方法,...

    ruby on rails

    Ruby on Rails,简称Rails,是基于Ruby编程语言的开源Web应用程序框架,它遵循MVC(模型-视图-控制器)架构模式,强调“约定优于配置”和DRY(Don't Repeat Yourself)原则,旨在提高开发效率和代码可读性。...

    Recursion-Trees:非常简单的分形树,用 Ruby 和 Gosu 制作

    通过这个项目,我们可以领略到编程艺术的魅力,递归不仅仅是一个抽象的算法概念,它也可以转化为可视化的艺术作品。同时,这也是一次将理论知识应用于实践的好机会,无论是对Ruby语言的学习,还是对递归算法的理解,...

    battle-sinatra:使用Ruby和Sinatra编写的战斗游戏

    Sinatra是一个基于DSL(领域特定语言)的Web框架,它的设计灵感来源于DHH的Ruby on Rails。Sinatra通过简单的路由规则来处理HTTP请求,比如`get '/' do`用于定义处理GET请求的代码块。此外,Sinatra支持模板引擎,...

    rubycourse

    《Ruby课程概述》 ...通过RubyCourse的学习,你可以掌握编写高效、可维护的Ruby代码的技巧,同时也能领略到动态语言的魅力和灵活性。对于想要进入Web开发或者对元编程感兴趣的开发者来说,这是一个极好的起点。

Global site tag (gtag.js) - Google Analytics