Menu
Coddy logo textTech

Travailler avec des fichiers

Fait partie de la section Programmation orientée objet du Journey Ruby de Coddy. Leçon 1 sur 57.

Les vrais programmes sont répartis dans plusieurs fichiers. Un fichier Ruby en charge un autre avec require_relative, suivi du chemin du fichier relatif au fichier actuel, généralement sans l’extension .rb. Après cette ligne, les méthodes et les classes du fichier chargé peuvent être utilisées :

# greeting.rb
def greeting(name)
  "Hello, #{name}!"
end

# main.rb
require_relative 'greeting'
puts greeting("Ada")

L’exécution de ruby main.rb affiche Hello, Ada! : main.rb charge greeting.rb, puis appelle sa méthode.

Le programme démarre dans le fichier que vous exécutez, ici main.rb, et Ruby l’exécute de haut en bas. require_relative exécute l’autre fichier à ce moment-là, et uniquement la première fois : un deuxième require_relative 'greeting' renvoie false et ne fait rien. Un nom ne peut être utilisé qu’après le chargement du fichier qui le définit :

# main.rb
# puts greeting("Bo")          # NoMethodError: greeting.rb n'est pas encore chargé
require_relative 'greeting'     # exécute greeting.rb, retourne true
require_relative 'greeting'     # déjà chargé, retourne false
puts greeting("Bo")

L’organisation habituelle consiste à avoir une classe par fichier, le fichier étant nommé d’après la classe en snake_case : class Dog se trouve dans dog.rb, et class BankAccount dans bank_account.rb. Dans les exercices de cette section, main.rb contient le code d’entrée/sortie fourni et commence par une ligne require_relative par fichier, dans l’ordre de chargement : une classe sur laquelle une autre classe s’appuie est chargée en premier.

dog.rb            # class Dog ... end
bank_account.rb   # class BankAccount ... end
functions.rb      # méthodes d'aide
main.rb           # lignes require_relative, puis le code d'entrée/sortie

Ce qu’un fichier partage dépend du type de nom. Les méthodes définies avec def au début d’un fichier, ainsi que les classes et les constantes, peuvent être utilisées par chaque fichier chargé après lui. Une variable locale appartient uniquement à son propre fichier :

# settings.rb
limit = 3                  # variable locale : seul settings.rb la voit
MAX_ITEMS = 3              # constante : visible après le chargement
def limit_text
  "at most #{MAX_ITEMS}"
end

# main.rb
require_relative 'settings'
puts limit_text            # au plus 3
puts MAX_ITEMS             # 3
# puts limit               # NameError: variable locale non définie
challenge icon

Défi

Facile

Le programme comporte deux fichiers. main.rb charge greeting.rb, lit les noms et affiche le résultat de greeting(name). Complétez greeting dans greeting.rb afin qu’il renvoie Hello, Ada! pour le nom Ada, ou Hello, friend! lorsque le nom est vide.

Votre code doit être placé dans greeting.rb. main.rb contient le code d’entrée/sortie fourni et ne peut pas être modifié.

Essayez vous-même

require_relative 'greeting'

# Code d'entrée/sortie fourni : le garder tel quel
input = []
while (line = gets)
  input << line.chomp
end
input.each { |name| puts greeting(name) }
quiz iconTestez-vous

Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.

Toutes les leçons de Programmation orientée objet

Entraînez-vous par vous-même : Compilateur Ruby en ligne