2016-03-23 12 views
0

2つの異なる方法で初期化できるオブジェクトを作成したいと思います。私は同じことを達成する3つの異なる方法を見つけました。私の方法のうちのどれが最良のものであるかを知りたいし、もっと良い方法があるかどうかを知りたいのです。Rubyクラスの初期化

方法

attr_accessor :id, :status, :dateTime 
    def initialize *args 
    if args.length == 1 
     puts args[0] 
    @id = args[0]['id'] 
    @status = args[0]['status'] 
    @dateTime = args[0]['dateTime'] 
    else 
     @id = args[0] 
     @status = args[1] 
     @dateTime = args[2] 
    end 
    end 

方法2:(Iは第二の方法として、このいずれかを手動でパラメータを設定する必要があることに注意)

attr_accessor :id, :status, :dateTime 
    def initialize hash = nil 
    if hash != nil 
    @id = hash['id'] 
     @status = hash['status'] 
     @dateTime = hash['dateTime'] 
    end 
    end 

方法3:(I設定する必要があることに注意してくださいこのパラメータを手作業で2番目の方法として手に入れ、それはコンストラクタではなく、私の2番目の方法とほぼ同じです)

attr_accessor :id, :status, :dateTime 
    def initialize 
    end 

    def self.create hash 
    if hash != nil 
     obj = Obj3.new 
     obj.id = hash['id'] 
     obj.status = hash['status'] 
     obj.dateTime = hash['dateTime'] 
     return obj 
    end 
    end 

ありがとうございます!

+0

どのような議論がありますか? – sawa

+0

'メソッド2:(これを手作業でパラメータを設定する必要があることに注意してください)' 2番目の方法/方法は2番目の方法に従うことは明白ではありませんか? – sawa

+0

@澤私はもっと明確にする必要があったかもしれません。 id、status、dateTimeのハッシュを取るか、パラメータなしでオブジェクトを初期化し、object.id = "id"などと言うことができます。 –

答えて

3

私は道コンストラクタであなたの特性のそれぞれを設定するオプションになるというDRY Ruby Initialization with Hash Argument

class Example 
    attr_accessor :id, :status, :dateTime 

    def initialize args 
    args.each do |k,v| 
     instance_variable_set("@#{k}", v) unless v.nil? 
    end 
    end 
end 

から適応下記のコードのようなあなたのコンストラクタのハッシュを使用しようとするだろう。 hasに値が含まれている場合、instance_variable_setメソッドは各プロパティを設定します。

これは、オブジェクトの作成方法をいくつでもサポートできることを意味します。唯一の欠点は、コード内で無制限にチェックする必要があるかもしれないが、それ以上の情報がなければ知ることは難しいということです。

my_new_example = Example.new :id => 1, :status => 'live' 
#=> #<Example: @id=1, @status='live'> 

をそして作成するのに十分なその柔軟性: - 新しいオブジェクトの作成

使用例

は、あなたがする必要があるすべてはあなたのイニシャライザにハッシュを渡しているこの技術を使用して新しいオブジェクトを作成するにはオブジェクトが作成された後あなたはまだあなたの特性を更新することができ

my_second_new_example = Example.new :id => 1 
#=> #<Example: @id=1> 

my_third_new_example = Example.new :status => 'nonlive', :dateTime => DateTime.new(2001,2,3) 
#=> #<Example: @id=1, @dateTime=2001-02-03T00:00:00+00:00> 

:1つのコンストラクタを持つ特定のプロパティのない複数のオブジェクト

my_new_example.id = 24 
+0

しかし、オブジェクトを初期化するのと同じように、ハッシュまたはオブジェクトとのやりとりを介して値を設定する必要があります。obj = Example.new; obj.id = "id" –

+1

- 私はいくつかの使用例で答えを更新します。 – Tom

+0

私が正しく理解するならば、私は任意の量のパラメータでオブジェクトを初期化することができます。与えられていないものはゼロになり、後で設定することができます。また、正しく理解すれば、私は言うことができます my_new_example = Example.new my_new_example.id = 23 –