Menu
CoddyTech

Travailler avec des fichiers

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

Les programmes réels 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 à cet endroit, et uniquement la première fois : un second 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, renvoie true
require_relative 'greeting'     # déjà chargé, renvoie false
puts greeting("Bo")

La disposition habituelle est d’avoir une classe par fichier, le fichier portant le nom de la classe en snake_case : class Dog se trouve dans dog.rb, class BankAccount dans bank_account.rb. Dans les défis 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 dont une autre classe hérite est chargée en premier.

dog.rb            # class Dog ... end
bank_account.rb   # class BankAccount ... end
functions.rb      # méthodes utilitaires
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 en haut d’un fichier, les classes et les constantes peuvent être utilisées par tous les fichiers chargés après celui-ci. Une variable locale n’appartient qu’à son propre fichier :

# settings.rb
limit = 3                  # variable locale : seul settings.rb y a accès
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 maximum 3
puts MAX_ITEMS             # 3
# puts limit               # NameError: undefined local variable
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ète greeting dans greeting.rb afin qu’elle renvoie Hello, Ada! pour le nom Ada, ou Hello, friend! lorsque le nom est vide.

Ton code va dans greeting.rb. main.rb contient le code fourni pour l’entrée/sortie et ne peut pas être modifié.

Essayez vous-même

require_relative 'greeting'

# Code d'entrée/sortie fourni : conservez-le 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