Ich habe gerade etwas über statische Variablen in PHP gelernt. Gibt es so etwas in Rubin?
Wenn wir beispielsweise eine Student
Klasse erstellen möchten und für jedes student
Objekt, das wir erstellen, sollte die ID-Nummer automatisch erhöht werden.
Ich dachte, das Erstellen einer Klassenvariablen als statische Variable reicht aus.
Antworten:
Klassenvariablen werden von allen Instanzen gemeinsam genutzt (weshalb sie als Klassenvariablen bezeichnet werden), sodass sie das tun, was Sie wollen. Sie werden auch vererbt, was manchmal zu verwirrendem Verhalten führt, aber ich denke nicht, dass dies hier ein Problem sein wird. Hier ist ein Beispiel für eine 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
quelle
@@foos = 0
ist nicht dieselbe Variable wie die anderen beiden, es ist eine Klassenvariable der KlasseClass
(Foo ist eine Instanz der Klasse Class). Ich werde die Abwertung entfernen, wenn Sie sie korrigieren .class Foo; @@foo = "foo" end
die Klassenvariable@@foo
für Foo und nicht für Class festgelegt. Probieren Sie es aus:class Foo; @@foo = 1 end; class Object; @@foo end
wird eine produzierenNameError: uninitialized class variable @@foo in Class
.Die Verwendung der akzeptierten Antwort als Definition der statischen Variablen kann gefährlich sein, und es ist ein häufiger Fehler, den ich in vielen Ruby-Codes gesehen habe.
So etwas
@@foos
wird von ALLEN Unterklassen geteilt. Die meisten Programmierer erwarten jedoch, dass statische Variablen nur innerhalb der Klasse Gültigkeitsbereich haben, in der sie definiert sind.Wenn Sie nach statischen Variablen im Sinne der meisten Sprachen suchen, deren Gültigkeitsbereich nur ihre eigene Klasse ist, sehen Sie sich diese SO-Antwort an
Auch dieser Blog-Beitrag enthält ein schönes Beispiel für die Überraschung, die die meisten Programmierer erleben werden:
http://www.railstips.org/blog/archives/2006/11/18/class-and-instance-variables-in-ruby/
quelle