Chaînes de caractères
Ruby traite les chaînes de caractères aussi bien que les nombres. Une chaîne peut être entre guillemets (”...”) ou entre apostrophes (’...’).
ruby> "abc"
"abc"
ruby> 'abc'
"abc"
Guillemets et apostrophes ont des effets différents dans certains cas. Une chaîne entre guillemets permet d’utiliser des séquences d’échappement en mettant un anti-slash devant les caractères voulus, et l’évaluation d’expressions incluses dans la chaîne et entourées de #{}. Une chaîne entre apostrophes ne permet pas tout ça et ne dit rien que ce qu’elle montre. Exemples :
ruby> print "anbnc","n"
a
b
c
nil
ruby> print 'anbnc',"n"
anbnc
nil
ruby> "n"
"n"
ruby> 'n'
"\n"
ruby> "001"
"001"
ruby> '001'
"\001"
ruby> "abcd #{53} efg"
"abcd 15 efg"
ruby> var = " abc "
" abc "
ruby> "1234#{var}5678"
"1234 abc 5678"
Le traitement des chaînes par Ruby est plus intelligent et plus intuitif que celui de C. Par exemple, on peut concaténer des chaînes avec + et répéter une chaîne n fois avec * :
ruby> "foo" + "bar"
"foobar"
ruby> "foo" * 2
"foofoo"
Concaténer des chaînes est beaucoup plus pénible en C parce qu’il faut gérer explicitement l’allocation mémoire correspondante :
char *s = malloc(strlen(s1)+strlen(s2)+1);
strcpy(s, s1);
strcat(s, s2);
/ ... */
free(s);
Au contraire, avec ruby, on n’a pas à se soucier de la place occupée par une chaîne. On ne s’occupe pas du tout de la gestion de la mémoire.
Voici plusieurs choses qu’on peut faire avec les chaînes.
- Concaténation :
ruby> word = "fo" + "o"
"foo"
- Répétition :
ruby> word = word * 2
"foofoo"
- Extraction de caractères (notez que les caractères sont des entiers pour ruby) :
ruby> word[0]
102 # 102 est le code ASCII pour `f'
ruby> word[-1]
111 # 111 est le code ASCII pour `o'
(Les indices positifs indiquent des positions à partir du début de la chaîne, les indices négatifs à partir de la fin.)
- Extraction de sous-chaînes :
ruby> herb = "parsley"
"parsley"
ruby> herb[0,1]
"p"
ruby> herb[-2,2]
"ey"
ruby> herb[0..3]
"pars"
ruby> herb[-5..-2]
"rsle"
- Test d’égalité :
ruby> "foo" "foo"
true
ruby> "foo" "bar"
false
Maintenant, mettons ces éléments au travail. Voici un jeu “Quel mot est-ce ?” — mais le mot « jeu » est peut-être un peu excessif pour ce qui suit ;-)
# sauver ceci en devine.rb
mots = ['foobar', 'baz', 'quux']
secret = mots[rand(3)]
print "Devine ? "
while devine = STDIN.gets
devine.chop!
if devine == secret
print "Tu gagnes!n"
break
else
print "Dommage, tu perds.n"
end
print "Devine ? "
end
print "Le mot était ", secret, ".n"
Pour l’instant ne vous souciez pas trop du détail du code. Voici ce que produit une exécution.
% ruby guess.rb Devine? foobar Dommage, tu perds. Devine? quux Dommage, tu perds. Devine? ^D Le mot était baz.
(J’aurais pu faire mieux, vu la probabilité de 1/3…)
Précédent : GDU : Des exemples simples Suivant : GDU : Expressions régulières


