Escopo refere-se à vida e acessibilidade de uma variável. Quão grande é o alcance depende de onde uma variável é declarada. Por exemplo, se uma variável é declarada na parte superior de uma classe, ela será acessível a todos os métodos de classe. Se for declarada num método, em seguida, só pode ser utilizada em tal método.
O escopo de uma variável é a parte do programa que pode acessar uma variável. Quando você tenta acessar uma variável que não está no escopo, você normalmente tem um erro do compilador. Aqui estão algumas das regras de escopo:
- Variáveis globais estão no escopo do programa e podem ser utilizadas dentro de classes.
- Variáveis de classe (campos estáticos) estão no escopo em todos os lugares na classe.
- As variáveis e parâmetros locais estão no escopo apenas dentro do método que os declarou.
Exemplo:
Neste exemplo utilizamos tipos de variáveis que possuem diferentes alcances dentro do programa e de sua respectiva classe. Utilize os comentários no código abaixo para entender os diferentes tipos de escopos.
Ruby
#!/usr/bin/env ruby # Desenvolvimento Aberto # Escopo.rb $variavel_global = "olá sou uma variavel global e existo em todo programa" # Define classe class Escopo # Variável da classe existe em toda a classe # não precisa de uma instancia do objeto para existir @@variavel_estatica = 0 # Existe para toda a classe e fora dela (Métodos públicos - Variável Privada) attr_accessor :variavel_publica # Construtor da classe def initialize() @@variavel_estatica += 1 @variavel_publica = "publica existo em toda classe e sub-classes" end # Retorna variável estatica def self.variavel_estatica() return @@variavel_estatica end # Imprime variável global def imprimeVariavelGlobal() $variavel_global = "Variável global modificada na classe" puts $variavel_global end #Imprime variável publica def imprimeVariavelPublica() puts variavel_publica end # Imprime variável local # Existe somente dentro do método def imprimeVariavelLocal() variavel_local = "Sou uma variável local e só existo dentro deste método" puts variavel_local end end # Imprime escopos puts "---------------- Escopos ----------------\n\n" puts "imprime variável global:" puts $variavel_global puts "Imprime variável da classe: " puts Escopo.variavel_estatica # Cria uma instancia da classe escopo = Escopo.new puts "Imprime variável global dentro da classe:" puts escopo.imprimeVariavelGlobal puts "Imprime variável privada com métodos públicos:" puts escopo.imprimeVariavelPublica puts "Imprime variável local:" puts escopo.imprimeVariavelLocal puts "Reimprime variável da instancia pois já existe um objeto instanciado: " puts Escopo.variavel_estatica