2013-10-10 2 views
0

는 :루비 : 왜 이런 방식으로 작동합니까? 이 코드에서

class A 
    @@a = 0 
    def initialize 
     @@a = @@a + 1 
    end 

    def to_s 
    @@a 
    end 
end 

a = A.new 
p a 
b = A.new 
p b 

출력은 1과 2입니다하지만이 def initialize ... end를 제거하고 세 번째 줄에 @@a = 0 직후 @@a = @@a + 1이있는 경우, 출력은 1과 1 나는 알고 초기화 후 객체 인 경우 initialize 메서드는 A.new을 호출 한 후 첫 번째 메서드로 실행되지만 클래스 변수 @@a이 어떻게 처리되는지는 잘 모르겠습니다.

메서드 내에서 @@a = @@a + 1을 래핑하지 않은 경우 왜 @@a 변수가 자동 증가하지 않습니까? 당신이 A.new, @@a = 0@@a = @@a + 1 => 1 = 0 + 1을 호출 한 후에 증가하기 때문에 의미가 있습니다. b = A.new에 대해, 당신은 반복하고 2를 얻습니다. 어떤 이유로 이런 일이 일어나지 않습니다. 왜 모르겠어요.

답변

3

클래스의 본문에있는 코드가 클래스가로드 될 때 한 번 실행되기 때문입니다. 따라서 @@a 클래스 변수는 한 번만 증가합니다.

initialize 코드는 A.new을 호출 할 때마다 실행됩니다.

3

Ruby가 파일을 위에서 아래로 실행 중입니다.

  1. @@a를 클래스 변수를 정의하는 클래스 정의를 입력하고, 0
  2. initialize 함수 및를 정의 할당 다음 initialize 기능 버전에

    은 루비 (대략 말하기) to_s function
  3. initialize을 실행 중이고 @@a을 1로 수정하여 A을 새로 만듭니다.
  4. ,

    1. @@a 클래스가 변수 정의 클래스 정의를 입력 :
    2. initialize를 실행 아닌 함수에서 @@a와 버전 @@a 2-

    를 증가, 새로운 A 작성 그것을 할당한다 0

  5. 클래스 변수를 @@a 1로 증가시킨다.
  6. to_s 기능

그래서 @@a이 일단 을 증가 전용에는 초기화를 실행하지

  • 새로운 A를 작성에는 초기화를 실행하지, 새로운 A 작성 정의 - 루비는의 코드를 실행할 때 클래스 정의.

  • 관련 문제