Interview / Février 2006

Exemple de programme

Voici une petite introduction à Ruby. Si vous avez installé Ruby sur votre machine (voir encart en bas de page), lancez la commande irb (le shell interactif Ruby) et tapez les exemples de code ci-dessous ligne par ligne.

Tout d'abord l'inévitable « Hello World ». Très simplement écrit à l'aide de la méthode puts (put string) ou print :

irb> puts "Hello World!"

Comme indiqué plus haut tout dans Ruby est objet. Mais me direz vous où sont les classes et les objets dans l'exemple tout simple donné ci-dessus. En vérité l'exemple ci-dessus est vu par l'interpréteur Ruby comme une contraction de :

irb> STDOUT.puts("Hello World!")

Ici STDOUT est un objet de la classe IO (Input/Output) qui régit tous les aspects entrées/sorties. STDOUT correspond à la sortie standard (standard output) du process en cours d'éxécution. Ruby crée systématiquement cet objet pour nous au démarrage. C'est pour cette raison que nous avons pu l'utiliser directement dans cet exemple sans avoir à le créer au préalable.

Ensuite la méthode puts est invoquée sur l'objet STDOUT. Cette méthode prend en argument une chaine de caractère qui qui n'est autre qu'un objet de la classe String. La notation "..." est en effet interprétée comme un constructeur de la classe String pour parler le langage Java ou C++.

Comme vous n'êtes pas obligé de me croire sur parole, vous pouvez procéder à certaines vérifications à l'aide de votre Shell Ruby Interactif.

Demandons tout d'abord à STDOUT à quelle classe il appartient :

irb> STDOUT.class
=> IO

Il est bien de la classe IO.

On peut faire de même pour la chaine de caractères :

irb> "Hello World!".class
=> String

De la même façon un entier (ci-dessous l'entier -5) est aussi un objet et il répond lui aussi à des méthodes :

irb> -5.class
=> Fixnum
irb> -5.abs   # la valeur absolue de -5 est bien 5
=> 5

Notez au passage que Fixnum est la classe des nombres entiers codés sur 32 ou 64 bits selon l'architecture de la machine. Au delà Ruby transforme automatiquement les entiers en objet Bignum dont la précision est illimitée (très pratique pour le calcul scientifique !) :

irb> 5**30
=> 931322574615478515625
irb> (5**30).class
=> Bignum

Ecrivons maintenant notre première classe. Emparez-vous de votre éditeur favori, créez le fichier salutations.rb et insérez-y le code suivant (en omettant les numéros de ligne) :

  1. class Salutation
  2.  
  3.   def initialize(message)
  4.      @message = message
  5.   end
  6.  
  7.   def saluer(nom)
  8.      "#{@message} #{nom}"
  9.   end
  10.  
  11. end
  12.  
  13. 13 sb = Salutation.new("Bonjour")
  14. sa = Salutation.new("Au revoir")
  15. puts sb.saluer("Agathe")   # Bonjour Agathe
  16. puts sa.saluer("Clément")   # Au revoir Clément
  17. exit

La classe est créée en ligne 1 à l'aide du mot clé réservé class suivi du nom de la classe. Les noms de classe commencent obligatoirement par une majuscule. Ruby adopte la notation dite « CamelCase » pour les noms de classe comme Java et C#. Les noms de méthodes et les variables référençant des objets utilisent uniquement des minuscules et le caractère souligné (_) pour séparer les mots. Par convention le nom d'une méthode qui renvoie les booléens vrai ou faux se termine par le caractère '?' (comme si on posait une question à l'objet) et si la méthode détruit ou modifie l'objet cible, son nom se termine par un point d'exclamation '!' (une façon de mettre le développeur en garde). Cette façon de faire donne du sens au code et le rend plus lisible. Enfin, les objets constants sont écrits en majuscules et les variables globales sont précédées du caractère '$'.

Exemples de nom de classe : Salutation, HTTPServer, Array, Hash, String
Exemples de nom de variables ou de méthodes : saluer, ma_variable, dis_bonjour, instance_of?, delete!
Exemples de nom de constantes : STDOUT, PI, ENV, ARGV
Exemples de variables globales : $0, $!, $DEBUG, $KCODE

Le mot clé réservé def à la ligne 3 introduit la définition d'une méthode. La méthode initialize est particulière: il s'agit du constructeur de la classe. Comme dans les autres langages orientés objet le constructeur permet d'initialiser les variables d'instance c'est à dire des variables dont la valeur est propre à chaque objet créé. En Ruby les variables d'instance sont précédées du caractère @. En ligne 4 la variable d'instance message est initialisée avec le paramètre passé au moment de la création d'un nouvel objet Salutation (ce que nous ferons à deux reprises en lignes 14 et 15).

La deuxième méthode "saluer" prend le nom d'une personne en paramètre puis construit une aimable salutation en ligne 8 pour la renvoyer à l'appelant. Cette ligne peut vous paraître étrange de prime abord. Elle utilise en effet deux expressions idiomatiques spécifiques au langage Ruby. Tout d'abord la construction "#{...}" qui se trouve dans une chaîne de caractère est automatiquement substituée par la valeur de l'expression entre accolades. Ici on va donc insérer dans la chaîne la valeur des variables @message et nom séparées par un espace. Le deuxième raccourci est lié au fait que Ruby se dispense souvent d'utiliser le mot clé "return" pour renvoyer une valeur. En effet par défaut c'est la valeur de la dernière expression évaluée dans la méthode qui est retournée : ici la chaîne elle-même. En ayant recours au mot clé "return" et en utilisant les opérateurs de concaténation "+" de la classe String on aurait pu écrire la ligne 8 de la façon suivante :

return @message+" "+nom

Les fans de C++ aurait aussi pu aussi opter pour la forme suivante :

return(@message << " " << nom)

Bref, en Ruby comme en Perl il y a plusieurs façons d'écrire la même chose. Cependant, avec le temps, la communauté Ruby a souvent adopté une façon de faire qui est considérée comme la bonne (ici la forme de la ligne 8).

Le mot "end" en ligne 11 clôt la définition de la classe Salutation. Dans les lignes qui suivent (13 à 17) on trouve le corps du programme : dans d'autres langages il s'agirait de la méthode main. En ligne 13 et 14 on crée deux objets Salutation distincts : sb et sa. Au premier on a appris à dire bonjour et au second, au revoir. La méthode new est le nom de méthode réservé pour créer un objet. A l'appel de new, c'est Ruby lui même qui crée l'objet en mémoire et il fait ensuite appel à la méthode initialize de la classe correspondante pour terminer l'initialisation de l'objet (d'où le nom initialize).

Les deux objets "sb" et "sa" sont ensuite sollicités : on demande à "sb" de saluer Agathe en ligne 15 et à "sa" de saluer Clément.

Le mot exit en ligne 17 termine le programme. Il est facultatif.

Voilà donc un avant-goût de Ruby. Bien d'autres choses vous attendent si vous prenez le temps d'explorer plus avant ce langage passionnant. Il est notamment un domaine où Ruby excelle : la méta-programmation, c'est à dire la capacité du langage à s'analyser et à se modifier lui même (on parle souvent d'introspection ou de réflexion).

Ruby est aussi pourvu de très nombreuses librairies dans tous les domaines (manipulations de données, calcul, protocoles réseau en tout genre, programmation concurrente, sériation, programmation distribuée, traitement XML, interface base de données, LDAP, etc.) qui lui permet d'être à l'aise dans tous les domaines.

Soyez certain que si vous investissez un peu de temps sur Ruby, ce langage vous le rendra au centuple et vous donnera (ou, pour beaucoup, redonnera...) le plaisir de programmer !


Installer Ruby :

Ressources :

Propos recueillis par Laetitia Maraninchi.


A lire

 Livres

Et nos interviews sur...



Votre compte

E-mail :

Mot de passe :

Abonnements

Pour votre veille bibliographique :

Des services gratuits pour être informé des nouveautés qui vous intéressent...
Abonnez-vous !

Aide

Navigation principale

Recherche

Recherche détaillée

Outils

Rubriques

eyrolles.com est un service de la Librairie Eyrolles - 61, boulevard Saint-Germain - 75005 Paris

© 1999-2008 Groupe Eyrolles