2012-11-02 83 views
0

我希望能夠寫代碼象下面這樣:嘗試寫簡單的DSL在Ruby中

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

嗯,我定義在它的模塊和類:

module MyModule 
class MyClass 
end 
end 

.. 。我應該怎麼做呢?

+0

問題標題和問題是不相似的。你能解決這個問題嗎?編輯:好吧,你修好了。謝謝。 –

回答

3

如果你想要做的配置,那麼我會建議你使用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的類改爲模塊。

+0

如何在不使用Singleton的情況下做到這一點? –

+0

我想你忘了'def self.configure 產生自我 end'的東西。這是讓步自我。 –

+0

不使用單身是在帖子的底部。 –

1

您應該編寫將塊作爲參數的類方法,並將其與新創建的item實例進行比較。像這樣的東西

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