在Ruby中编写DSL的教程

Ste*_*han 32 ruby dsl

有关如何在Ruby中实现DSL的优秀在线教程是什么?我正在寻找解释整个过程的动手实例.

我知道在关于DSL和Ruby的好书上有这个问题:关于基于Ruby的DSL的好书.

Upg*_*ave 35

我认为这是关于在ruby中构建dsl的一系列很棒的文章:

http://jroller.com/rolsen/entry/building_a_dsl_in_ruby


ms-*_*-tg 34

使用gem可以使用Docile gem,或者通过阅读源代码来了解它的工作方式,这样可以很容易.

假设您想通过DSL 制作比萨饼

Pizza = Struct.new(:cheese, :pepperoni, :bacon, :sauce)
Run Code Online (Sandbox Code Playgroud)

并且您使用构建器模式来制作Pizza

class PizzaBuilder
  def cheese(v=true); @cheese = v; end
  def pepperoni(v=true); @pepperoni = v; end
  def bacon(v=true); @bacon = v; end
  def sauce(v=nil); @sauce = v; end
  def build
    Pizza.new(!!@cheese, !!@pepperoni, !!@bacon, @sauce)
  end
end
Run Code Online (Sandbox Code Playgroud)

你想要一个DSL,比如说

@sauce = :extra
pizza do
  bacon
  cheese
  sauce @sauce
end
# => should return Pizza.new(true, false, true, :extra)
Run Code Online (Sandbox Code Playgroud)

您所要做的就是将披萨方法定义为

require 'docile'

def pizza(&block)
  Docile.dsl_eval(PizzaBuilder.new, &block).build
end
Run Code Online (Sandbox Code Playgroud)

砰,你做完了.

  • -1因为,虽然Docile肯定非常好,但使用它*绕过*编写普通Ruby DSL而不是解释它是如何完成的过程. (5认同)
  • @ 00Davo,虽然你有资格获得你的意见,这是一个非常不友好的姿态.特别是考虑到Docile的源代码是学习如何在ruby中创建DSL的好方法. (4认同)