我希望能够编写如下代码:
MyModule::MyClass.configure do |item|
item.var1 = 'dsads'
item.var2 = 'dsadsa'
item.var3 = 'fdsfdsfd'
end
好吧,我在其中定义了一个模块和一个类:
module MyModule
class MyClass
end
end
......我该怎么做?
答案 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