(下)高级元编程指南:创建一个Ruby DSL

原文请见Creating a Ruby DSL: A Guide to Advanced Metaprogramming

精简语法

当前的实现还有最后一个地方让人揪心——在配置代码块里不得不重复配置每一行。恰如其分的DSL都应知道,配置代码块里的所有东西将在配置对象的上下文内执行,并且这样可以实现同样的效果:

MyApp.configure do  
  app_id "my_app"
  title "My App"
  cookie_name "my_app_session"
end  

来,撸起袖子继续加油干!从表面上看,需要做两件事。首先,需要一种方式来执行在配置对象上下文内传递给configure的代码块,以便在代码块的方法调用作用于那个对象。其次,要修改访问器方法,以便做到有一个参数时就写入该值、没有参数时就读取。一个可能的实现是:

module Configurable  
  def self.with(*attrs)
    not_provided = Object.new

    config_class = Class.new do

继续阅读»»»

(上)高级元编程指南:创建一个Ruby DSL

原文请见Creating a Ruby DSL: A Guide to Advanced Metaprogramming

领域特定语言(DSL)是一个强大到令人难以置信的工具,因为它把编写或者配置复杂的系统变得更为简单。同时它们无处不在——作为一名软件工程师,你很可能在日常事务中使用了多种不同的DSL。

在这篇文章,你将会学习到什么是领域特定语言,什么时候应该使用它们,以及如何使用Ruby的高级元编程技术创建你自己专属的DSL。

此文章基于Nikola Todorovic发布在Toptal博客上关于Ruby元编程的介绍,如果你是初次接触元编程,请先阅读一下那篇文章。

什么是领域特定语言?

对于DSL的普遍定义是,它们是某一特定应用域或用例的专门语言。这意味着,你只能在指定的方面使用DSL——它们不适合普遍目的的软件开发。如果这听起来有点虚,是因为——DSL本来就千奇百怪。以下是一些重要的分类:

  • 标记性语言,例如HTML和CSS设计用于描述类似结构、内容、网站页面风格这些指定的事物。标记性语言不能用于编写任何算法,所以它们适合DSL的描述。

  • 在某


继续阅读»»»