Variables globales dans Ruby

Les variables globales sont les variables accessible à partir de n'importe où dans le programme, quelle que soit sa portée. Ils sont indiqués en commençant par un caractère $ (signe dollar). Cependant, l'utilisation de variables globales est souvent considérée comme «non Ruby» et vous les verrez rarement.

Définition de variables globales

Les variables globales sont définies et utilisées comme n'importe quelle autre variable. Pour les définir, attribuez-leur simplement une valeur et commencez à les utiliser. Mais, comme leur nom l'indique, l'attribution à des variables globales à partir de n'importe quel point du programme a des implications mondiales. Le programme suivant le démontre. La méthode modifiera une variable globale, et cela affectera la façon dont le seconde s'exécute.


$ speed = 10. def accélérer. $ speed = 100. fin. def pass_speed_trap. si $ speed> 65. # Donnez au programme un ticket pour excès de vitesse. fin. fin. accélérer. pass_speed_trap. 

Impopulaire

Alors pourquoi est-ce "non-Ruby" et pourquoi ne voyez-vous pas très souvent des variables globales? En termes simples, cela rompt l'encapsulation. Si une classe ou une méthode peut modifier l’état des variables globales à volonté sans couche d’interface, tout d'autres classes ou méthodes qui s'appuient sur cette variable globale peuvent se comporter de manière inattendue et indésirable manière. De plus, de telles interactions peuvent être très difficiles à déboguer. Qu'est-ce qui a modifié cette variable globale et quand? Vous allez parcourir pas mal de code pour trouver ce qui l'a fait, et cela aurait pu être évité en ne violant pas les règles d'encapsulation.

instagram viewer

Mais cela ne veut pas dire que les variables globales sont jamais utilisé en Ruby. Il existe un certain nombre de variables globales spéciales avec des noms à un seul caractère (a-la Perl) qui peut être utilisé tout au long de votre programme. Ils représentent l'état du programme lui-même et font des choses comme modifier les séparateurs d'enregistrement et de champ pour tous obtient méthodes.

Variables globales

  • $0 - Cette variable, notée $ 0 (c'est un zéro), contient le nom du script de niveau supérieur en cours d'exécution. En d'autres termes, le fichier de script exécuté à partir du ligne de commande, pas le fichier de script contenant le code en cours d'exécution. Donc si script1.rb a été exécuté à partir de la ligne de commande, il contiendrait script1.rb. Si ce script nécessite script2.rb, 0 $ dans ce fichier de script serait également script1.rb. Le nom $ 0 reflète la convention de dénomination utilisée dans les scripts shell UNIX dans le même but.
  • $* - Les arguments de ligne de commande dans un tableau noté $ * (signe dollar et astérisque). Par exemple, si vous deviez exécuter ./script.rb arg1 arg2, alors $ * serait équivalent à % w {arg1 arg2}. Cela équivaut à la spéciale ARGV tableau et a un nom moins descriptif, il est donc rarement utilisé.
  • $$ - L'ID de processus de l'interpréteur, désigné par $$ (signes à deux dollars). Connaître son propre identifiant de processus est souvent utile dans les programmes démon (qui s'exécutent en arrière-plan, sans aucun terminal) ou les services système. Cependant, cela devient un peu plus compliqué lorsque les threads sont impliqués, alors méfiez-vous de l'utiliser à l'aveugle.
  • $ / et $ \ - Ce sont les séparateurs d'enregistrement d'entrée et de sortie. Lorsque vous lisez des objets à l'aide obtient et imprimez-les en utilisant met, il les utilise pour savoir quand un "enregistrement" complet a été lu, ou quoi imprimer entre plusieurs enregistrements. Par défaut, il doit s'agir du caractère de nouvelle ligne. Mais comme ceux-ci affectent le comportement de tous les objets d'E / S, ils sont rarement utilisés, voire pas du tout. Vous pouvez les voir dans des scripts plus petits où la violation des règles d'encapsulation n'est pas un problème.
  • $? - Le statut de sortie du dernier processus enfant exécuté. De toutes les variables répertoriées ici, c'est probablement la plus utile. La raison en est simple: vous ne pouvez pas obtenir le statut de sortie des processus enfants par leur valeur de retour système méthode, seulement vrai ou faux. Si vous devez connaître la valeur de retour réelle du processus enfant, vous devez utiliser cette variable globale spéciale. Encore une fois, le nom de cette variable est tiré des shells UNIX.
  • $_ - La dernière chaîne lue par obtient. Cette variable peut être un point de confusion pour ceux qui viennent à Ruby de Perl. En Perl, le $ _ variable signifie quelque chose de similaire, mais totalement différent. En Perl, $_ contient la valeur de la dernière instruction et Ruby contient la chaîne renvoyée par la précédente obtient invocation. Leur utilisation est similaire, mais ce qu'ils détiennent vraiment est très différent. Vous ne voyez pas souvent cette variable non plus (à bien y penser, vous voyez rarement l'une de ces variables), mais vous pouvez les voir dans des programmes Ruby très courts qui traitent du texte.

En bref, vous verrez rarement des variables globales. Ils sont souvent de mauvaise forme (et "non-Ruby") et ne sont vraiment utiles que dans de très petits scripts, où la pleine implication de leur utilisation peut être pleinement appréciée. Il y a quelques variables globales spéciales qui peuvent être utilisées, mais pour la plupart, elles ne sont pas utilisées. Vous n'avez pas vraiment besoin de tout savoir sur les variables globales pour comprendre la plupart des programmes Ruby, mais vous devez au moins savoir qu'ils sont là.

instagram story viewer