Variabili globali in Ruby

Le variabili globali lo sono variabili a cui è possibile accedere da qualsiasi parte del programma indipendentemente dall'ambito. Sono indicati iniziando con un carattere $ (simbolo del dollaro). Tuttavia, l'uso di variabili globali è spesso considerato "un-Ruby" e raramente le vedrai.

Definizione di variabili globali

Le variabili globali sono definite e utilizzate come qualsiasi altra variabile. Per definirli, è sufficiente assegnare loro un valore e iniziare a usarli. Ma, come suggerisce il nome, l'assegnazione a variabili globali da qualsiasi punto del programma ha implicazioni globali. Il seguente programma lo dimostra. Il metodo modificherà una variabile globale e ciò influenzerà il modo in cui secondo il metodo funziona.


$ velocità = 10. def accelerare. $ velocità = 100. fine. def pass_speed_trap. se $ velocità> 65. # Dai al programma un biglietto per eccesso di velocità. fine. fine. accelerare. pass_speed_trap. 

Impopolare

Allora perché è "un-Ruby" e perché non vedi le variabili globali molto spesso? In parole povere, rompe l'incapsulamento. Se una qualsiasi classe o metodo può modificare lo stato delle variabili globali a piacimento senza alcun livello di interfaccia, qualsiasi altre classi o metodi che si basano su quella variabile globale possono comportarsi in modo imprevisto e indesiderabile maniera. Inoltre, tali interazioni possono essere molto difficili da eseguire il debug. Cosa ha modificato quella variabile globale e quando? Guarderai attraverso un sacco di codice per scoprire cosa l'ha fatto, e ciò avrebbe potuto essere evitato non infrangendo le regole dell'incapsulamento.

instagram viewer

Ma questo non vuol dire che le variabili globali lo siano mai usato in rubino. Esistono numerose variabili globali speciali con nomi a carattere singolo (a-la Perl) che possono essere utilizzati in tutto il programma. Rappresentano lo stato del programma stesso e fanno cose come modificare i separatori di record e di campo per tutti prende metodi.

Variabili globali

  • $0 - Questa variabile, indicata da $ 0 (che è uno zero), contiene il nome dello script di livello superiore in esecuzione. In altre parole, il file di script che è stato eseguito da riga di comando, non il file di script che contiene il codice attualmente in esecuzione. Quindi se script1.rb è stato eseguito dalla riga di comando, avrebbe trattenuto script1.rb. Se questo script richiede script2.rb, $ 0 in quel file di script sarebbe anche script1.rb. Il nome $ 0 rispecchia la convenzione di denominazione utilizzata negli script di shell UNIX per lo stesso scopo.
  • $* - Gli argomenti della riga di comando in un array indicato da $ * (segno di dollaro e asterisco). Ad esempio, se dovessi correre ./script.rb arg1 arg2, quindi $ * sarebbe equivalente a % w {arg1 arg2}. Questo equivale allo speciale ARGV array e ha un nome meno descrittivo, quindi viene usato raramente.
  • $$ - L'ID del processo dell'interprete, indicato da $$ (due simboli di dollaro). Conoscere il proprio ID processo è spesso utile nei programmi daemon (che vengono eseguiti in background, non collegati da alcun terminale) o nei servizi di sistema. Tuttavia, questo diventa un po 'più complicato quando sono coinvolti i thread, quindi diffidare di usarlo ciecamente.
  • $ / e $ \ - Questi sono i separatori dei record di input e output. Quando leggi oggetti usando prende e stamparli usando mette, li utilizza per sapere quando è stato letto un "record" completo o cosa stampare tra più record. Per impostazione predefinita, questi dovrebbero essere il carattere di nuova riga. Ma poiché questi influenzano il comportamento di tutti gli oggetti IO, vengono usati raramente, se non del tutto. Potresti vederli in script più piccoli in cui la violazione delle regole di incapsulamento non è un problema.
  • $? - Lo stato di uscita dell'ultimo processo figlio eseguito. Di tutte le variabili elencate qui, questa è probabilmente la più utile. Il motivo è semplice: non è possibile ottenere lo stato di uscita dei processi figlio in base al valore restituito da sistema metodo, solo vero o falso. Se è necessario conoscere il valore restituito effettivo del processo figlio, è necessario utilizzare questa speciale variabile globale. Ancora una volta, il nome di questa variabile è preso dalle shell UNIX.
  • $_ - L'ultima stringa letta da prende. Questa variabile può essere un punto di confusione per coloro che arrivano a Ruby dal Perl. In Perl, il $ _ variabile significa qualcosa di simile, ma totalmente diverso. In Perl, $_ contiene il valore dell'ultima istruzione e in Ruby contiene la stringa restituita dalla precedente prende invocazione. Il loro utilizzo è simile, ma ciò che tengono davvero è molto diverso. Spesso non vedi nemmeno questa variabile (pensaci, raramente vedi una di queste variabili), ma potresti vederli in programmi Ruby molto brevi che elaborano il testo.

In breve, vedrai raramente variabili globali. Sono spesso in cattive condizioni (e "un-Ruby") e sono davvero utili solo in script molto piccoli, in cui la piena implicazione del loro uso può essere pienamente apprezzata. Esistono alcune variabili globali speciali che possono essere utilizzate, ma per la maggior parte non vengono utilizzate. Non hai davvero bisogno di sapere tutto sulle variabili globali per capire la maggior parte dei programmi di Ruby, ma dovresti almeno sapere che sono lì.

instagram story viewer