« Programmation Ruby/Types standards » : différence entre les versions

Contenu supprimé Contenu ajouté
Correction de nombreuses fautes orthographiques
Ligne 1 :
[[Programmation Ruby|<< Retour au sommaire]]
 
Nous allons voir ici touttous les types que nous pouvons considérer comme "standards", dans le sens où nous les retrouvons dans la plupart des langages, et que ceux-ci sont directement intégrés à l'interpreteurinterpréteur (''built-in''). Néanmoins il ne faut pas perdre de vue qu'il sagits'agit en réalité d'objets.
 
Pour rappel les méthodes terminantdont le nom se termine par ''!'' sont non pures : elles modifient l'objet.
 
== Chaîne de caractères ==
Ligne 33 :
Un autre moyen de créer une chaine est d'utiliser ''%q'' ou ''%Q'', qui équivalent respectivement au simple et au double quote. Neanmoins l'utilisation de ''%q'' ou ''%Q'' permet de définir le caractère d'ouverture et de fermeture de la chaine :
 
%q!j'utilise le caractère \:! pour ouvrir ou fermer la chaine, ' et " peuvent ainsi être utilisés sans \ !
%q*je peux utiliser n'importe quel caractère non alpha-numérique qui n'est pas dans la chaine elle même*
 
Si nous avons plusieurs lignes de texte à écrire nous pouvons utiliser les caractères ''<<'' suivit d'un identifiant pour créer une chaine ayant les mêmes propriétés qu'une chaine entre double quote, ou les charactèrescaractères ''<<-'' suivitsuivis d'un identifiant entre simple quote pour créer un chaine de caractères ayant les mêmemêmes propriétés qu'une chaine entre simple quote :
 
i = 100
Ligne 54 :
i vaut #{i}
 
Le dernier moyen d'obtenir une chainechaîne de caractères est d'utiliser la méthode ''to_s'' que la plupart des objets implémentent, ainsi :
 
42.to_s => "42"
Ligne 60 :
=== Comparaisons de chaînes ===
 
Les chaînes de caractères peuvent être comparées entre elles comme indiqués dans le chapitre [[Programmation Ruby Controle#Expressions booléennes|Expressions booléennes]] grace aux méthodes ''<, <=, ==, >=, >''
 
"abcdef" <=> "abcde" => 1
"abcdef" <=> "abcdef" => 0
"abcdef" <=> "abcdefg" => -1
"abcdef" <=> "ABCDEF" => 1 # Les caractères majusculemajuscules sont supérieurs aux caractères minuscules
"abc" <=> "acc" => 1
Ligne 83 :
"a" != "b" => true
 
La méthode est équivalente à ''<=>'', aà part que la casse n'est pas comparécomparée :
 
"abcdef".casecmp("ABCDEF") => 0
Ligne 93 :
===== length =====
 
''length'' permet de connaitre la taille d'une chainechaîne de caractères :
 
"Bonjour le monde".length => 16
Ligne 99 :
===== index et rindex =====
 
''index'' renvoi l'index de la première occurence d'une sous chainechaîne dans la chainechaîne de caractères, renvoi ''nil'' si aucune occurence n'a été trouvée :
 
"hello".index('e') => 1
Ligne 111 :
Nous pouvons également utiliser une [[Programmation Ruby Types standards#Expression rationelle|expression rationelle]].
 
''rindex'' effectue le même travail à la différence près que la recherche se fait à partir de la fin de la chainechaîne de caractères :
 
"Bonjour le monde".rindex('o') => 12
Ligne 119 :
"Bonjour le monde".rindex('o',9) => 4
 
A noté que si se second paramètre est négatif, alors l'index est compté à partir de la fin de la chainechaîne :
 
"Bonjour le monde".rindex('o',-9) => 4
"Bonjour le monde".rindex('o',-2) => 12
 
==== Opérateurs sur les chaineschaînes de caractères ====
 
===== * =====
L'opérateur de multiplication renvoie une chaine de caractères contenant ''n'' fois la chainechaîne représentéreprésentée par l'objet :
 
"Ho! " * 3 => Ho! Ho! Ho!
Ligne 133 :
===== + =====
 
L'opérateur d'addition permet de concaténer deux chaineschaînes de caractères :
 
maChaine = "le Monde"
Ligne 141 :
===== [] et []= =====
 
L'opérateur ''[]'' permet de récuperer un ou plusieurs caractères faisant parti d'une chainechaîne.
Si un entier est passé en paramètre, l'opérateur renverra le code ascii du caractère correspondant (le premier caractère est indéxeindexé par la valeur 0) :
 
maChaine = "Bonjour le monde"
maChaine[3] => 106 #Corespond Correspond au code ascii du 4ème caractère (j)
 
Si deux entiers sont passés en paramètres, l'opérateur renverra une sous-chainechaîne commençant à l'index passé en premier paramètre et de la longueur indiquée par le second élément :
 
maChaine[1,5] => onjou
Ligne 156 :
maChaine[1..6] => onjou
 
Il est à noter que si l'index est négatif, ruby compte à partir de la fin de la chainechaîne :
maChaine[-3,5] => nde
Ligne 162 :
On peut également utiliser une [[Programmation Ruby Types standards#Expression rationelle|expression rationelle]], nous verrons cela plus en détail dans le chapitre correspondant.
 
L'opérateur ''[]='' permet de changer le contenu d'une chaine de caractères. L'utilisation est semblable à celle de ''[]'', à la différence que plutotplutôt que de renvoyer un ensemble de caractères, l'opérateur modifiera la chainechaîne :
 
maChaine[3] = "V"
Ligne 178 :
puts maChaine => Bonjour Roger
 
On peut directement utiliser une chainechaîne de caractères ou une [[Programmation Ruby Types standards#Expression rationelle|expression rationelle]] :
 
maChaine["Bonjour"] = "Hello"
Ligne 184 :
 
 
==== Formatage de chainechaîne ====
 
===== split =====
 
''split'' permet de séparer les différents éléments d'une chainechaîne en fonction d'un ou plusieurs délimiteurs, par défaut ceux-ci sont les fins de ligne et les espaces (''\s'', ''\t'', ''\r'',''\n'' et ''\r\n''). La méthode renvoi un tableau contenant les différents éléments :
 
"Bonjour le monde".split => ["Bonjour", "le", "monde"]
Ligne 201 :
===== chomp, chomp!, chop et chop! =====
 
''chop'' et ''chop!'' permettent de supprimer le dernier caractère d'une chainechaîne, néanmois si les deux dernier caractères sont "''\r\n''", les deux caractères sont supprimés :
 
"Bonjour\r\n".chop => "Bonjour"
Ligne 214 :
"Bonjour le monde".chomp => "Bonjour \n le monde"
 
Si une chainechaîne de caractères est donnée en paramètre, celle-ci est supprimésupprimée si elle est termine la chainechaîne :
"Bonjour".chomp("jour") => "Bon"
"Bonjour\r\n".chomp("jour") => "Bonjour\r\n"
 
Pour rappel, les méthodeméthodes finissant par "''!''" sont des méthodes non pures : elles modifient l'objet appelant.
 
===== downcase, downcase!, upcase, upcase!, swapcase, swapcase!, capitalize et capitalize! =====
Ligne 238 :
===== '''%''' =====
 
L'opérateur ''%'' permet de formater la chainechaîne de caractères. Le format utilisé est le même que celui de la fonction ''sprintf'' de ruby et de bien d'autres langages tel le [[Programmation C|''C'']]. Le format est décrit par le caractère ''%'' suivitsuivi d'un indicateur optionnel, un indicateur de taille, de précision et de type.
 
Les infidcateursindicateurs de typestype :
 
{|border="1"
Ligne 251 :
| d ou i || nombre entier
|-
| e || converticonvertit un nombre entier sous sa forme exponentielle avec un chiffre avant la virgullevirgule, la précision indique le nombre de chiffrechiffres après la virgullevirgule (par défaut 6)
|-
| E || comme ''e'' mais utilise le caractère majuscule ''E'' pour indiquéindiquer l'exponantexposant
|-
| f || nombre flotantflottant, la précision indique le nombre de chiffres après la virgule
|-
| g || comme ''e'' mais converti en nombre flotantflottant
|-
| G || comme ''E'' mais converti en nombre flotantflottant
|-
| o || nombre octal
Ligne 265 :
| p || symbole
|-
| s || chaine de caractères, si une précision est donnédonnée, alors elle indique le nombre de caractères
|-
| u || nombre entier non signé (par d'indicateurpas de signe)
|-
| x || hexadecimal en utilisant les caractères minuscules (par exemple ''f'')
|-
| X || hexadecimal en utilisant les caractères majuscules (par exemple ''F'')
|}
 
Ligne 287 :
| - || bdeEfgGioxXu || Ajoute un ''-'' au début des nombres négatifs
|-
| 0 || ''tous'' || RempliRemplit le format avec des ''0'' plutotplutôt que des espaces
|-
| . || ''tous'' || Prend l'argument suivant comme taille, sipour aligner à droite s'il est positif. Si l'argument est négatif, allignealigne à gauche
|}
 
Ligne 325 :
| f || Considère ''sizeof(float)'' caractères comme un flotant|| Float
|-
| G || Considère ''sizeof(double)'' caractères comme un double dans l'ordre réseau || Float
|-
| g || Considère ''sizeof(float)'' caractères comme un flotant dans l'ordre réseau || Float
|-
| H || Extrait le code hexadécimal de chaque caractère (bit de poids fort en premier) || String
Ligne 341 :
| i || Considère 4 caractères consécutifs comme un entier long signé || Integer
|-
| M || Décode les chaineschaînes "quoted printable" || String
|-
| m || Décode les chaineschaînes en Base64 || String
|-
| N || Considère 4 caractères consécutifs comme un entier long non signé dans l'ordre réseau|| Fixnum
Ligne 349 :
| n || Considère 2 caractères consécutifs comme un entier court non signé dans l'ordre du réseau|| Fixnum
|-
| P || Considère ''sizeof(char *)'' comme un pointeur et renvoi la taille de la chainechaîne ainsi référencée || String
|-
| P || Considère ''sizeof(char *)'' comme un pointeur sur une chainechaîne terminéterminée par le caractère ''null'' (''\0'') || String
|-
| S || Considère 2 caractères consécutifs comme un entier court non signé dans l'ordre natif du système || Fixnum
Ligne 357 :
| s || Considère 2 caractères consécutifs comme un entier court signé dans l'ordre natif du système || Fixnum
|-
| U || Extrait une chainechaîne encodéencodée au format UTF8 comme des entiers non signés || Integer
|-
| u || Extrait une chainechaîne encodéencodée en UU || String
|-
| V || Considère 4 caractères consécutifs comme un entier long non signé en "little endian" || Fixnum
Ligne 369 :
| x || Avance d'un caractère || N/A
|-
| Z || Supprime les caractères ''null'' de fin || String
|-
| @ || Se déplace du nombre donné en argument || N/A
|}
 
La chainechaîne de format se compose d'un nombre de directivedirectives à piocher dans le tableau précédantprécédent, optionnelementoptionnellement suivitsuivi d'un nombre indiquant le nombre de fois qu'il faut répeterrépéter cette directive, un astérisque (''*'') correspondant a tous les éléments restant. Les directives ''s'',''S'',''i'',''I'',''l'' et ''L'' peuvent être suivitsuivis d'un underscore (''_'') indiquant de choisir le format natif du système.
 
Exemples :
Ligne 388 :
=== Itérateurs ===
 
Les itérateurs sont un mécanisme puissant de ruby, ils permetentpermettent de parcourir les éléments d'un objet. Nous verrons plus tard comment étendre facilement comme étendre sa propre classe avec des itérateurs. Pour chaque type que nous allons voir, nous allons voir ses itérateurs. A l'heure actuelle considérons simplement un itérateur comme une méthode prenant un bloc pour paramètre (et d'ailleurs c'est ce que les itérateurs sont : de simples méthodes).
 
==== succ, succ! et upto ====
 
''succ'' se contente de renvoyer l'élément succédant à la chainechaîne, en pratique ''succ'' incrémente le dernier caractère alphanumérique de la chainechaîne, si celui-ci àa ateindatteint sa limite, ''succ'' incrémentera l'avant dernier caractère et ainsi de suite:
 
"abcd".succ => "abce"
Ligne 399 :
"1999zzz".succ => "2000aaa"
 
''upto'' itère à travers les valeurs successivesuccessives d'une chainechaîne, jusqu'aà arrivéarriver à la chainechaîne passépassée en paramètre. La méhode incrémente à partir de la dernière valeur alphanumérique de la chainechaîne :
 
"<<aa>>".upto("<<bb>>") do
Ligne 435 :
==== each_byte ====
 
''each_byte'' permet d'itérer à travers la chainechaîne de caractères, octet par octet,. laLa valeur qui sera envoyée au bloc sera le code ascii (donc un entier) du caractère :
 
"bonjour".each_byte {|i| print i.to_s+" "} => 98 111 110 106 111 117 114
Ligne 456 :
== Valeur numérique ==
 
En ruby les valeurs numériques sont soit flottanteflottantes soit entièreentières et sont de taille infiniesinfinie (jusqu'auà la limite de mémoire du système).
Plus tôt dans le livre, nous avons indiqué qu'un type entier est de type ''Integer'',. enEn fait nous avons menti,. leLe type Integer permet en réalité de cacher le type réel de la valeur. En effet pour, les valeurs inférieurs aux valeurs d'un entier sur le système (donc en général 32 ou 64 bits) sont en réalité de type ''Fixnum'',. auAu dessusdelà, elles seront de types ''Bignum''. En pratique la conversion est transparente pour le développeur :
 
i = 10
Ligne 472 :
=== Syntaxe ===
 
En ruby une valeur numérique peut s'écrire de différente forme, notament en fonction de la base utiliséutilisée.
 
Classiquement, une valeur numérique peut s'écrire comme une suite de chiffre,chiffres séparéséparés éventuellement par des caractères de soulignement ( ''_'') qui seront ignorés lors de l'interprétation. Une valeur négative est simplement préfixépréfixée par le signe moinmoins (''-'') :
 
42 => 42
Ligne 493 :
4.class => Fixnum
 
Certains objets, comme l'objet ''String'', possèdepossèdent une méthode ''to_i" qui renvoi si possible une valeur entière, et ''to_f'' qui renvoi si possible un flotant :
 
" 58_87".to_i => 5887
 
Si la chaîne contient des éléments non numériquenumériques, à l'exception du caractère de soulignement ou du signe moinmoins, la valeur renvoyée sera celle de la première valeur numérique trouvétrouvée et précédant les autres caractères :
 
"toto".to_i => 0
Ligne 531 :
9/3 => 3
 
ATTENTION: Le type renvoyé est du type des opérateursopérandes, ainsi si la division n'est pas entière, seul le dividende est renvoyé:
 
9/4 => 2
 
par contre, si nous utilisons desau flottantsmoins un flottant, le type renvoyé sera de type flottant :
 
9.0/4.0 => 2.25
 
Une division par 0 lève une exception (nous verrons les exceptions plus tard, il suffit de considérer à l'heure actuelle qu'il s'agit d'une erreur) et intérrompintérrompt le courcours du programme si celle-ci n'est pas interceptée :
 
9/0 => ZeroDivisionError: divided by 0
Ligne 545 :
==== ** ====
 
L'opérateur ''**'' permet d'augmenter une valeur numérique à la puissance indiquéindiquée en paramètre :
 
9**2 => 81
Ligne 558 :
=== Itérateurs ===
 
La classe ''Integer '' propose également certains itérateurs, comme pour tout autresautre itérateursitérateur, ceux-ci prennent un ou plusieurs paramètres ainsi qu'un bloc de code.
 
==== succ ====
Ligne 577 :
==== upto et downto ====
 
''upto'' et ''downto'' permetentpermettent respectivement d'itérer à partir de la valeur de l'objet jusqu'aà la valeur passépassée en paramètre, respectivement en incrémentant ou en décrémentant :
 
5.upto(8) do |i| print i.to_s+'..' end
Ligne 590 :
==== step ====
 
''step'' ressemble à ''upto'' et ''downto'' à part que l'on peut ici préciser le pas :
5.step(48, 5) do |i| print i.to_s+'..' end #ici le second paramètre corespondcorrespond au pas
=> 5..10..15..20..25..30..35..40..45..
 
== Expression rationelle ==
 
Les expressions rationelles (également nommésnommées expressions régulières) sont un mécanisme puissant mais qui peut être complexe. Elles permettent des recherches dans une chaîneschaîne de caractères selon des critèrecritères ou un modèle de recherche précis. Ceci permet la sélection d'une sous chaîne de caractères, ou la manipulation des chaînes ainsi trouvéstrouvées (typiquement une substitution).
 
Ruby propose une classe pour l'utilisation des expressions rationelles, les développeurs perl seront heureux car son utilisation en ruby est quasi-identique.