Des exemples simples
Ecrivons une fonction pour calculer des factorielles. La définition mathématique de la factorielle de n est :
n! = 1 #(n==0)
n!= n * (n-1)! #(sinon)
En ruby cela peut s’écrire :
def fact(n)
if n == 0
1
else
n * fact(n-1)
end
end
Remarquez les deux end. Ruby a été qualifié de langage de la famille d’Algol à cause de ça. (En fait, la syntaxe de ruby imite plutôt celle du langage Eiffel). Vous remarquerez aussi l’absence d’une instruction return. Elle est superflue parce qu’en ruby, une fonction retourne la dernière chose qu’elle a évaluée. On peut utiliser un return ici, mais ça n’est pas nécessaire.
Essayons notre fonction factorielle. Il suffit d’ajouter une ligne de code pour avoir un programme utilisable :
# Programme donnant la factorielle d un nombre
# Sauver ce source en fact.rb
def fact(n)
if n == 0
1
else
n * fact(n-1)
end
end
print fact(ARGV[0].to_i), "\n"
Ici, ARGV est un tableau qui contient les arguments de la ligne de commande, et to_i convertit une chaîne de caractères en un entier.
% ruby fact.rb 1
1
% ruby fact.rb 5
120
Est-ce que ça marche si on passe 40 en argument ? Cela devrait donner un overflow…
% ruby fact.rb 40
815915283247897734345611269596115894272000000000
Ca marche. En fait, ruby peut affronter n’importe quel entier, dans les limites de la mémoire. Par exemple 400! Peut être calculé :
% ruby fact.rb 400
64034522846623895262347970319503005850702583026002959458684
44594280239716918683143627847864746326467629435057503585681
08482981628835174352289619886468029979373416541508381624264
61942352307046244325015114448670890662773914918117331955996
44070954967134529047702032243491121079759328079510154537266
72516278778900093497637657103263503315339653498683868313393
52024373788157786791506311858702618270169819740062983025308
59129834616227230455833952075961150530223608681043329725519
48526744322324386699484224042325998055516106359423769613992
31917134063858996537970147827206606320217379472010321356624
61380907794230459736069956759583609615871512991382228657857
95493616176544804532220078258184008484364155912294542753848
03558374518022675900061399560145595206127211192918105032491
00800000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000
On ne peut pas affirmer au premier coup d’oeil que c’est bon, mais ça devrait l’être :-)
La boucle de saisie/évaluation
Quand on appelle ruby sans argument, il lit les commandes depuis l’entrée standard, et les exécute à la fin de la saisie (ctrl-D sous UNIX, ctrl-Z sous DOS) :
% ruby
print "hello world\n"
print "good-bye world\n"
^D
hello world
good-bye world
Ruby nous vient aussi avec un programme appelé eval.rb qui permet de saisir du code au clavier en boucle, en montrant le résultat au fur et à mesure. Ce programme sera utilisé tout au long de ce tutorial.
Si vous avez un terminal ANSI (ce qui est sûrement vrai sous UNIX ; sous DOS, il faut avoir chargé ANSI.SYS ou ANSI.COM), vous devriez utiliser cet eval.rb amélioré qui offre indentation, messages d’avertissement, et coloration syntaxique. Sinon, regardez dans le répertoire /sample de la distribution ruby où se trouve la version non-ANSI qui marche sur n’importe quel type de terminal.
Pour trouver où ce fichier est situé, vous pouvez par exemple faire, sous UNIX :
% locate eval.rb
/usr/share/doc/ruby-1.8.2/sample/eval.rb
Voici une petite session en eval.rb :
% ruby eval.rb
ruby> print "Hello, world.\n"
Hello, world.
nil
ruby> exit
hello world est produit par print. La ligne suivante, en l’occurrence nil, se rapporte à ce qui a été évalué en dernier, ruby ne distinguant pas entre instructions et expressions, évaluer un bout de programme signifiant à peu près la même chose que l’exécuter. Ici, nil indique que print ne rend pas une valeur ayant un sens. Noter que l’on quitte cette boucle d’interprétation en tapant exit, quoique ^D marche aussi.
Tout au long de ce guide, ruby> correspond à l’invite de saisie de notre petit programme eval.rb.
Guide de l’utilisateur Précédent : GDU : Pour commencer Suivant : GDU : Chaînes de caractères

