2012-02-15 42 views
2

在構造函數中,經常發生想要將參數變爲實例變量的情況。一個天真的方式做到這一點是:在構造函數中使用splat運算符有效嗎?

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是很慢,足以額外的陣列應該不會太大的關係。 *鴨子* – 2012-02-15 22:44:02

+0

不是一個真正的答案,但我會建議編寫一個測試程序,使用每個構造函數定義實例化數千個對象。比較每次完成的時間將產生兩個實現中更快的時間。 – ardnew 2012-02-15 22:46:00

+0

我知道你特別關心速度,但鑑於第二個片段丟棄了重要的信息(方法的論點),很難看出爲什麼會這樣寫... – tokland 2012-02-15 23:11:17

回答

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 2012-02-15 23:20:13

相關問題