试着在Ruby中编写简单的DSL

时间:2012-11-02 04:08:17

标签: ruby

我希望能够编写如下代码:

MyModule::MyClass.configure do |item|
  item.var1 = 'dsads'
  item.var2 = 'dsadsa'
  item.var3 = 'fdsfdsfd'
end

好吧,我在其中定义了一个模块和一个类:

module MyModule
 class MyClass
 end
end

......我该怎么做?

2 个答案:

答案 0 :(得分:2)

如果你想进行配置,那么我建议你使用Singleton类,如下所示:

require 'singleton'
module MyModule
 class MyClass
   include Singleton
 end
end

然后您需要在此定义configure方法:

require 'singleton'
module MyModule
 class MyClass
   include Singleton
   def self.configure
     yield(self)
   end
 end
end

yield将在类的上下文中计算块,这意味着将在类对象上调用块对象上调用的任何方法。

然后,对于在configure块内调用的每个方法,您将需要在类中使用相应的方法定义。您可以通过手动定义方法来完成此操作:

 class MyClass
   def self.var1=(value)
     @var1 = value
   end

   def self.var1
     @var1
   end 
 end

或者,您可以使用attr_accessor

 class MyClass
   class << self
     attr_accessor :var1
   end
 end

要重新获取值,请执行以下操作:

 MyMoudle::MyClass.var1

如果您不想使用单例,请将代表MyClass的类更改为模块。

答案 1 :(得分:0)

您应该编写以块作为参数的类方法,并使用新创建的item实例生成它。像这样的东西

class MyClass
  def self.configure
    if block_given?
      item = ItemClass.new
      yield(item)
    end
  end
end