5 Stimmen

Sind Ruby-Klassenvariablen jetzt in Ordnung?

Im Mai letzten Jahres habe ich auf der Railsconf in Portland einen Vortrag gehört, in dem argumentiert wurde, dass Ruby-Klassenvariablen wie @@foo in Rails gefährlich sind, weil sie von Natur aus nicht thread-sicher sind.

Ich habe die Frage danach recherchiert und keinen Link gefunden, der die Frage wirklich vertieft. Ich wäre dankbar für einen Hinweis auf einen guten Artikel über Rails und Threads, der wirklich auf die Frage der Klassenmitglieder eingeht. Es wäre auch schön zu wissen, wie Rail 2+ und Yarv die Dinge in dieser Hinsicht verändert hat.

Edita:

Vielleicht ist meine Erinnerung an den Vortrag etwas verblasst, aber ich erinnere mich, dass @@foo Probleme hatte, die über die üblichen Warnungen hinausgingen, dass der Zugriff auf gemeinsam genutzte Variablen streng kontrolliert werden muss. Ich weiß, dass es Speicherlecks im Ruby-Code selbst gab, die vor einiger Zeit behoben wurden. Ich bin auf der Suche nach Links zu Artikeln über gemeinsam genutzte Ruby-Variablen und Multitasking, je ausführlicher, desto besser. *Momentan verwende ich Klassenvariablen aus diesem Grund nicht, aber es wäre schön, sie in bestimmten Situationen verwenden zu können.

5voto

womble Punkte 11538

Jeder gemeinsam genutzte veränderbare Zustand ist von Natur aus thread-unsicher. Sie müssen alle Zugriffe sperren, um sicherzustellen, dass alles sicher ist, und sicherstellen, dass alles re-entrant ist. @@foo ist besonders schlecht, weil es schwieriger ist, den Code zu überprüfen, da jede Unterklasse auf die Variable zugreifen kann. Rails 2+ "löste" das Problem, indem es alles überprüfte und sicherstellte, dass Mutexe und andere Synchronisationsprimitive verwendet wurden, wo es nötig war.

1voto

Mike Woodhouse Punkte 50241

Ich denke, sie sind so OK, wie sie jemals waren, aber immer noch mit Vorsicht in einer Rails-Umgebung verwendet werden, wo die Klasse mehrmals geladen werden kann (einmal pro mongrel, zum Beispiel, wenn Sie mongrel verwenden), so dass die Klasse Member-Variable unabhängig innerhalb dieser Prozesse variieren könnte.

Ich denke, es gibt eine Scoping-Änderung für @@-Variablen in Ruby 1.9 Das sollte man vielleicht berücksichtigen - eines Tages werden wir alle dort sein.

Hatten Sie eine bestimmte Verwendung im Sinn? Ich dachte kürzlich, ich bräuchte eine, aber es stellte sich heraus, dass mein (lückenhaftes) Verständnis des Themas fehlerhaft war - was ich tatsächlich brauchte, war eine Instanzvariable für die Klasse. (Ich war dabei, ein Modul zu bauen, um eine Klasse zu erweitern, so dass ich einige deklarative Makros im AR-Stil hinzufügen konnte).

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X