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 に答える