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

루비 충분히 그 여분 배열해야 문제가되지 너무 느립니다. * ducks * –

+0

정말 답이 아니지만 각 생성자 정의를 사용하여 수천 개의 객체를 인스턴스화하는 테스트 프로그램 작성을 제안합니다. 각각의 시간을 비교해 보면 두 가지 구현 중 빠를 것입니다. – ardnew

+0

나는 스피드에 특별히 관심이 있다는 것을 알고있다. 그러나 두 번째 스 니펫이 중요한 정보 (메서드의 주장)를 버리는 것을 감안할 때, 왜 그런 식으로 쓰는지 이해하기가 어렵다. – 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

관련 문제