我希望能夠寫代碼象下面這樣:嘗試寫簡單的DSL在Ruby中
MyModule::MyClass.configure do |item|
item.var1 = 'dsads'
item.var2 = 'dsadsa'
item.var3 = 'fdsfdsfd'
end
嗯,我定義在它的模塊和類:
module MyModule
class MyClass
end
end
.. 。我應該怎麼做呢?
我希望能夠寫代碼象下面這樣:嘗試寫簡單的DSL在Ruby中
MyModule::MyClass.configure do |item|
item.var1 = 'dsads'
item.var2 = 'dsadsa'
item.var3 = 'fdsfdsfd'
end
嗯,我定義在它的模塊和類:
module MyModule
class MyClass
end
end
.. 。我應該怎麼做呢?
如果你想要做的配置,那麼我會建議你使用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
的類改爲模塊。
如何在不使用Singleton的情況下做到這一點? –
我想你忘了'def self.configure 產生自我 end'的東西。這是讓步自我。 –
不使用單身是在帖子的底部。 –
您應該編寫將塊作爲參數的類方法,並將其與新創建的item實例進行比較。像這樣的東西
class MyClass
def self.configure
if block_given?
item = ItemClass.new
yield(item)
end
end
end
問題標題和問題是不相似的。你能解決這個問題嗎?編輯:好吧,你修好了。謝謝。 –