La portée (Scope) en Ruby

Introduction

Dans le langage de programmation Ruby, la portée des variables définit le contexte dans lequel celles-ci existent. Cela signifie que la portée détermine quelles variables et méthodes peuvent être accessibles à partir d'une certaine partie du code. Il existe plusieurs niveaux de portée en Ruby :

Portée de classe (Class-level)

Les variables définies au niveau de class sont généralement précédées de @@. Ces variables peuvent être utilisées à l'intérieur de la classe ainsi que dans toutes les sous-classes. Voici un exemple :

class MaClasse  
  @@variable_de_classe = "Ceci est une variable de classe"  
  def méthode_intérieure  
    "De MaClasse: #{@@variable_de_classe}"  
  end  
end

class SousClasse < MaClasse  
  def afficher_variable_de_classe  
    "De SousClasse: #{@@variable_de_classe}"  
  end  
end

instance_classe = MaClasse.new()
instance_sous_classe = SousClasse.new()
puts instance_sous_classe.afficher_variable_de_classe  # Sortie: De SousClasse: Ceci est une variable de classe
puts instance_classe.méthode_intérieure  # Sortie: De MaClasse: Ceci est une variable de classe

Portée d'instance (Instance-level)

Les variables au niveau d'instance, marquées par @, sont généralement créées dans la méthode initialize d'une classe. Elles sont accessibles lorsque l'on travaille avec une instance de cette classe. Exemple :

class Personne  
  def initialize(nom)  
    @nom = nom  
  end  

  def nom  
    @nom  
  end  
end

personne = Personne.new("Randy")
puts personne.instance_variables  # Sortie: @nom
puts personne.nom  # Sortie: Randy

Portée globale (Global-level)

Les variables définies dans la portée globale peuvent être accédées de n'importe où dans le programme Ruby. Elles commencent par $. Voici un exemple :

$nombre_global = 42

def afficher_nombres  
  puts [$nombre_global]  
end

afficher_nombres  # Sortie: 42

Portée locale (Local-level)

Les variables définies dans une portée locale sont souvent très contextuelles. Leur portée est généralement déterminée par le bloc où elles sont définies. Par exemple :

variable_locale_extérieure = 32

def ajouter_nombres(term_externe)  
  variable_locale_méthode = 42  
  term_externe + variable_locale_méthode  
end

puts variable_locale_extérieure + ajouter_nombres(3)  # Sortie: 77