2010-03-10 4 views
62

방금 ​​PHP의 정적 변수에 대해 배웠습니다. 루비에 그런 것이 있습니까?루비의 정적 변수

예를 들어, Student 클래스를 만들고 우리가 만드는 student 개체마다 ID 번호가 자동으로 증가해야합니다.

클래스 변수를 정적으로 만들 것이라고 생각했습니다.

+0

@Andrew 존재하는 데이터베이스에 대한 언급이 없습니다. – Oddmund

+0

@Oddmund 나는 OP가 ID 번호를 원한 이유라고 생각했습니다. –

답변

97

클래스 변수는 모든 인스턴스간에 공유되므로 (클래스 변수라고도 함) 원하는대로 처리 할 수 ​​있습니다. 그들은 또한 때로는 다소 혼란스러운 행동으로 이어지는 상속을받습니다. 그러나 나는 이것이 문제가 될 것이라고 생각하지 않습니다. 여기의 여러 인스턴스가 생성 된 방법을 계산하는 클래스 변수를 사용하는 클래스의 예 : 정적 변수의 정의는 위험 할 수 있으므로 허용 대답을 사용하여

class Foo 
    @@foos = 0 

    def initialize 
    @@foos += 1 
    end 

    def self.number_of_foos 
    @@foos 
    end 
end 

Foo.new 
Foo.new 
Foo.number_of_foos #=> 2 
+0

고마워... 나는 내 코드에서 뭔가 바보 같은 짓을했고, 그 개념을 완전히 오해했다 .... – levirg

+0

-1 당신의 예제는 단점을 가지고있다.'@@ foos = 0'의 코드는 다른 두 코드와 같은 변수가 아니다. , 그 클래스의 클래스 변수'클래스'(Foo는 클래스 클래스의 인스턴스입니다), 당신이 그것을 수정하면 나는 downvote를 제거합니다. – clyfe

+4

@clyfe : 틀렸어. 당신은 클래스 변수를 인스턴스 변수와 혼동하고 있습니다. '클래스 Foo를하고있다; @@ foo = "foo"end'는 클래스가 아니라 Foo를위한 클래스 변수'@@ foo'를 설정합니다. 그것을보십시오 :'class Foo; @@ foo = 1 끝; 클래스 Object; @@ foo end'는'NameError : 초기화되지 않은 클래스 변수 @@ foo in Class'를 생성합니다. – sepp2k

13

, 그리고 그것은 일반적인 오류입니다 나는 루비 코드를 많이 보았다.

@@foos과 같은 내용은 ALL 하위 항목간에 공유됩니다. 그러나 대부분의 프로그래머는 정적 변수가 정의 된 클래스 내에서 범위 만 가질 것으로 기대합니다.

하기이 블로그 게시물은 대부분의 프로그래머가 얻을 것이다 놀라움의 좋은 예제가 this SO answer

보면, 그 범위는 자신의 클래스 대부분의 언어의 의미에서 정적 변수를 찾는 경우 :

http://www.railstips.org/blog/archives/2006/11/18/class-and-instance-variables-in-ruby/

+2

사실 다른 언어의 모든 하위 클래스에서 정적이 공유 될 것으로 예상되는 오해를 가진 사람들의 수에 놀랄 것입니다. P –