2016-01-02 14 views
9

Warum hat Ruby globale Variablen wie $$ überhaupt?Wofür sind Ruby Globals nützlich?

Konnte nicht ähnliches Verhalten durch Definieren von Zugriffsmethoden und Attributen in Kernel erhalten werden?

Soll das Überschreiben in Unterklassen verhindert werden?

+2

Fragen Sie speziell über die [spezielle Globals] (http://jimneath.org/2010/01/04/cryptic-ruby-global-variables-and-their-meanings.html) wie '$$' etc oder allgemein über globale Variablen? Die speziellen Globals sind einer der Einflüsse in Ruby, die von Perl kommen, und tatsächlich gibt es alternative Methoden, um die gleiche Information zu erhalten ('Process.id' im Falle von' $$ '), was heutzutage bevorzugt wäre. – mikej

+0

Globals im Allgemeinen, obwohl die Existenz von $$, $ 0 usw. ihre Verwendung zu sanktionieren scheint. –

+2

Ja, ein ähnliches Verhalten könnte durch Definieren von Methoden (Zugriffsmethoden) auf Kernel erhalten werden, aber "ähnlich", um das Offensichtliche zu sagen, ist nicht "gleich". Zum einen sind Methodenaufrufe in Ruby teuer, zumindest verglichen mit dem Zugriff auf eine globale Variable. –

Antwort

0

Diese Frage hat mehrere Teile und daher Antworten.

Q1.

Warum hat Ruby globale Variablen wie $$ überhaupt?

Ruby Anleihen von Perl und LISP. Beide haben globale Variablen.

Ruby erbte die Perl-Philosophie, mehr als eine Möglichkeit zu haben, dasselbe zu tun. Yukihiro Matsumoto - 29. September 2003

Q2.

Konnte nicht ähnliches Verhalten erhalten werden durch die Definition von Accessoren und Attribute in Kernel?

Ja, und sie waren. Es kann jedoch festgehalten werden, dass programmierte Werte vorhanden sind, die eine globale Anwendbarkeit haben und daher einen globalen Geltungsbereich haben sollten, ohne einen Zwischencode einzuführen.

Während es vielleicht mehr OO ist, diese innerhalb einer Klassenmethode einzukapseln, stellt sich die Frage, was für den Benutzer wichtiger ist, Einfachheit oder Stil. Der Name der Skriptdatei, die an die virtuelle Maschine übergeben wird, ist eine Invariante. Wie auch die Befehlszeilenargumente. Es ist wenig vorteilhaft, den Zugriff auf diese Werte durch eine Methode zu abstrahieren. Eine globale Variable ist ausreichend für den Zweck und ist so leicht wie möglich zu erreichen.

Q3.

Soll das Überschreiben in Unterklassen verhindert werden?

Die Antwort darauf ist mir unbekannt.

Schließlich kommen wir zu dem, was die Frage im Titel gefragt ist:

Was für Ruby Globals nützlich sind?

Man kann über die trace_var Kernel Methode Variablenzuweisungen in Ruby verfolgen:

trace_var :$_, proc {|v| puts "$_ is now '#{v}'" } 
$_ = "hello" 
$_ = ' there' 

Ausgänge zu STDOUT:

$_ is now 'hello' 
$_ is now ' there' 

Man kann von einer Anwendung vorstellen, die einige ereignisgesteuerte Änderung muss eine Variable mit dem Namen $ state, z. B. eine GUI oder ein Sensor-Feed, bei der das einfache Verfolgen von Änderungen an globalen Variablen die Notwendigkeit für Programmcode beseitigt, der im Wesentlichen die gleiche Funktion implementiert.

Verwandte Themen