2010-03-10 15 views
62

Ich habe gerade über statische Variablen in PHP gelernt. Gibt es so etwas in Rubin?statische Variablen in Ruby

Zum Beispiel, wenn wir eine Student Klasse erstellen möchten und für jedes student Objekt, das wir erstellen, sollte seine ID-Nummer automatisch inkrementiert werden.

Ich dachte, Erstellen von Variablen wie eine statische wird.

+0

@ Andrew Es gibt keine Erwähnung von jeder Datenbank vorhanden ist. – Oddmund

+0

@Oddmund Ich nahm an, deshalb wollte das OP eine ID-Nummer. –

Antwort

97

Klassenvariablen werden von allen Instanzen gemeinsam verwendet (weshalb sie als Klassenvariablen bezeichnet werden), sodass sie genau das tun, was Sie wollen. Sie werden auch geerbt, was manchmal zu ziemlich verwirrendem Verhalten führt, aber ich denke nicht, dass dies ein Problem sein wird. Hier ist ein Beispiel einer Klasse, die eine Klassenvariable verwendet, um zu zählen, wie viele Instanzen davon erstellt wurden:

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

Danke Mann..Ich tat etwas idiotisches in meinem Code, und total missverstanden das Konzept .... – levirg

+0

-1 Ihr Beispiel hat einen Nachteil, foos von '@@ foos = 0 'ist nicht die gleiche Variable mit den anderen beiden , es ist eine Klassenvariable der Klasse 'Class' (Foo ist eine Instanz der Klassenklasse), ich entferne den Downvote, wenn Sie ihn korrigieren. – clyfe

+4

@clyfe: Du liegst falsch. Sie verwechseln Klassenvariablen mit Instanzvariablen. Doing 'Klasse Foo; @@ foo = "foo" end' setzt die Klassenvariable '@@ foo' für Foo, nicht für Klasse. Probieren Sie es aus: 'Klasse Foo; @@ foo = 1 Ende; Klasse Objekt; @@ foo end' erzeugt eine 'NameError: nicht initialisierte Klassenvariable @@ foo in Class'. – sepp2k

13

die akzeptierte Antwort Verwendung als die Definition der statischen Variablen kann gefährlich sein, und es ist ein häufiger Fehler, dass Ich habe in vielen Ruby-Code gesehen.

Etwas wie @@foos wird unter ALL Unterklassen geteilt. Die meisten Programmierer erwarten jedoch, dass statische Variablen den Bereich nur innerhalb der Klasse haben, in der sie definiert sind.

Wenn Sie für statische Variablen im Sinne der meisten Sprachen suchen, wenn ihre Reichweite nur ihre eigene Klasse ist, schaut this SO answer

Auch in dieser Blog-Post hat ein schönes Beispiel für die Überraschung der meisten Programmierer erhalten:

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

+2

In der Tat werden Sie überrascht sein über die Anzahl von Menschen mit Missverständnissen, die erwarten, dass statische Unterklassen in allen anderen Unterklassen geteilt werden: P –