Эффективно ли использовать оператор splat в конструкторе? - PullRequest
3 голосов
/ 16 февраля 2012

В конструкторе часто случается так, что вы хотите превратить аргументы в переменные экземпляра.Наивный способ сделать это:

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, который не был создан в предыдущем коде.С точки зрения скорости или эффективности, лучше придерживаться первого и не использовать второе, или нет никакой разницы?

1 Ответ

4 голосов
/ 16 февраля 2012

Хорошо выглядит здесь:

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
...