Variáveis ​​globais em Ruby

Variáveis ​​globais são variáveis que podem ser acessados ​​de qualquer lugar do programa, independentemente do escopo. Eles são indicados começando com um caractere $ (cifrão). No entanto, o uso de variáveis ​​globais geralmente é considerado "não Ruby" e você raramente as vê.

Definindo variáveis ​​globais

Variáveis ​​globais são definidas e usadas como qualquer outra variável. Para defini-los, simplesmente atribua um valor a eles e comece a usá-los. Mas, como o nome sugere, atribuir a variáveis ​​globais a partir de qualquer ponto do programa tem implicações globais. O programa a seguir demonstra isso. O método modificará uma variável global e isso afetará como o segundo método é executado.


$ velocidade = 10. def acelerar. $ velocidade = 100. fim. def pass_speed_trap. se $ speed> 65. # Dê ao programa uma multa por excesso de velocidade. fim. fim. acelerar. pass_speed_trap. 

Impopular

Então, por que isso é "não Ruby" e por que você não vê variáveis ​​globais com muita frequência? Simplificando, ele quebra o encapsulamento. Se qualquer classe ou método puder modificar o estado das variáveis ​​globais à vontade, sem camada de interface, qualquer outras classes ou métodos que dependem dessa variável global podem se comportar de forma inesperada e indesejável maneira. Além disso, essas interações podem ser muito difíceis de depurar. O que modificou essa variável global e quando? Você analisará bastante código para descobrir o que fez isso, e isso poderia ter sido evitado se não se quebrassem as regras do encapsulamento.

instagram viewer

Mas isso não quer dizer que variáveis ​​globais sejam Nunca usado em Ruby. Existem várias variáveis ​​globais especiais com nomes de caracteres únicos (a-la Perl) que podem ser usados ​​em todo o programa. Eles representam o estado do próprio programa e fazem coisas como modificar os separadores de registro e campo para todos fica métodos.

Variáveis ​​globais

  • $0 - Essa variável, denotada por $ 0 (que é zero), contém o nome do script de nível superior que está sendo executado. Em outras palavras, o arquivo de script que foi executado a partir do linha de comando, não o arquivo de script que contém o código atualmente em execução. Então se script1.rb foi executado a partir da linha de comando, ele manteria script1.rb. Se esse script exigir script2.rb, $ 0 nesse arquivo de script também seriam script1.rb. O nome $ 0 reflete a convenção de nomenclatura usada nos scripts de shell do UNIX para o mesmo objetivo.
  • $* - Os argumentos da linha de comando em uma matriz indicada por $ * (cifrão e asterisco). Por exemplo, se você fosse executar ./script.rb arg1 arg2, então $ * seria equivalente a % w {arg1 arg2}. Isso é equivalente ao especial ARGV array e tem um nome menos descritivo, portanto raramente é usado.
  • $$ - O ID do processo do intérprete, indicado por $$ (dois cifrões). Conhecer o próprio ID do processo é frequentemente útil em programas daemon (que são executados em segundo plano, desanexados de qualquer terminal) ou nos serviços do sistema. No entanto, isso fica um pouco mais complicado quando estão envolvidos threads, portanto, tenha cuidado ao usá-lo às cegas.
  • $ / e $ \ - Estes são os separadores de registro de entrada e saída. Quando você lê objetos usando fica e imprima-os usando coloca, usa-os para saber quando um "registro" completo foi lido ou o que imprimir entre vários registros. Por padrão, esses devem ser o caractere de nova linha. Mas, como eles afetam o comportamento de todos os objetos de E / S, raramente são usados, se é que existem. Você pode vê-los em scripts menores, em que a quebra das regras de encapsulamento não é um problema.
  • $? - O status de saída do último processo filho executado. De todas as variáveis ​​listadas aqui, essa é provavelmente a mais útil. A razão para isso é simples: você não pode obter o status de saída dos processos filhos pelo valor de retorno deles. sistema método, apenas verdadeiro ou falso. Se você precisar conhecer o valor de retorno real do processo filho, precisará usar esta variável global especial. Novamente, o nome dessa variável é obtido dos shells do UNIX.
  • $_ - A última string lida por fica. Essa variável pode ser um ponto de confusão para quem vem do Ruby a partir do Perl. Em Perl, o variável $ _ significa algo semelhante, mas totalmente diferente. No Perl, $_ mantém o valor da última instrução e em Ruby mantém a string retornada pela anterior fica invocação. Seu uso é semelhante, mas o que eles realmente têm é muito diferente. Você também não vê essa variável frequentemente (pense bem, raramente vê uma dessas variáveis), mas pode vê-las em programas Ruby muito curtos que processam texto.

Em resumo, você raramente verá variáveis ​​globais. Eles geralmente são de má forma (e "un-Ruby") e são realmente realmente úteis em scripts muito pequenos, onde a implicação total de seu uso pode ser totalmente apreciada. Existem algumas variáveis ​​globais especiais que podem ser usadas, mas na maioria das vezes elas não são usadas. Você realmente não precisa saber muito sobre variáveis ​​globais para entender a maioria dos programas Ruby, mas pelo menos deve saber que eles estão lá.

instagram story viewer