2012-02-15 53 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

相关问题