0

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

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

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

module MyModule
 class MyClass
 end
end

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

4

2 回答 2

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为模块。

于 2012-11-02T04:15:17.053 回答
0

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

class MyClass
  def self.configure
    if block_given?
      item = ItemClass.new
      yield(item)
    end
  end
end
于 2012-11-02T04:16:44.393 回答