【问题标题】:Is it effcient to use a splat operator in a constructor?在构造函数中使用 splat 运算符是否有效?
【发布时间】:2012-03-07 08:07:12
【问题描述】:

在构造函数中,您经常希望将参数转换为实例变量。一种天真的方法是:

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,而前一个代码中没有创建这个数组。从速度或效率的角度来看,是坚持前者而不使用后者更好,还是没有区别?

【问题讨论】:

  • 不是一个真正的答案,但我建议编写一个测试程序,使用每个构造函数定义实例化数千个对象。比较每个完成的时间将产生两个实现中的更快。
  • 我知道你特别关心速度,但鉴于第二个 sn-p 丢弃了重要信息(方法的参数),很难理解为什么要这样写。 .

标签: ruby constructor ruby-1.9.3 splat


【解决方案1】:

从这里看起来不错:

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

【讨论】:

  • 我明白了。所以它只是有点慢。
猜你喜欢
  • 2012-02-08
  • 2017-07-29
  • 2017-05-17
  • 2021-09-18
  • 1970-01-01
  • 1970-01-01
  • 2018-10-10
  • 1970-01-01
  • 2014-01-11
相关资源
最近更新 更多