2012-02-15 15 views
2

コンストラクタでは、引数をインスタンス変数に変換したいことがよくあります。それを行うには素朴な方法は次のとおりです。スプラット演算子をコンストラクタで使用するのは効果的ですか?

class A 
    def initialize a, b, c 
     @a, @b, @c = a, b, c 
    end 
end 

もっと簡単な方法は次のとおりです。

class A 
    def initialize *args 
     @a, @b, @c = args 
    end 
end 

しかし、それは余分な配列を作成している後者のコードのように見えるので、私はコードの速度を心配していましたargsは前のコードでは作成されませんでした。スピードや効率性の観点から、前者のものに固執し、後者のものを使用しない方がいいですか、それとも違いはありませんか?

+0

Rubyは余分な配列はあまり重要ではないことを十分に遅いです。 *アヒル* –

+0

本当に答えはありませんが、私は各コ​​ンストラクタ定義を使用して何千ものオブジェクトをインスタンス化するテストプログラムを書くことをお勧めします。それぞれの時間を比較して終了すると、2つの実装の方が速くなります。 – ardnew

+0

私はあなたがスピードに特に関わっていることを知っていますが、2番目のスニペットが重要な情報(メソッドの引数)を捨てるとすれば、なぜそれをそのように書くのか分かりません... – tokland

答えて

4

はここから罰金ルックス:

RUBY_VERSION # => "1.9.3" 

def set_each(a,b,c) 
    a2, b2, c2 = a, b, c 
end 

def set_ary(*args) 
    a2, b2, c2 = args 
end 

def time(n) 
    start_time = Time.now 
    n.times { yield } 
    Time.now - start_time 
end 

n = 1_000_000 
time(n) { set_each 1, 2, 3 } # => 0.301268 
time(n) { set_ary 1, 2, 3 } # => 0.308298 
+0

私は参照してください。だからちょっと遅いです。 – sawa

関連する問題