以下のようなコードが書けるようになりたいです。
MyModule::MyClass.configure do |item|
item.var1 = 'dsads'
item.var2 = 'dsadsa'
item.var3 = 'fdsfdsfd'
end
さて、モジュールとその中にクラスを定義します。
module MyModule
class MyClass
end
end
...そして、さらにどうすればよいですか?
以下のようなコードが書けるようになりたいです。
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
代わりに表されるクラスをモジュールに変更してください。
ブロックを引数として取り、新しく作成されたアイテムのインスタンスでそれを生成するクラスメソッドを作成する必要があります。このようなもの
class MyClass
def self.configure
if block_given?
item = ItemClass.new
yield(item)
end
end
end