Retour au sommaire du support de cours

(Dernière modification : 2011/11/11)

Cliquez sur la table des matières pour la cacher / développer :

1) Historique :

Le Langage de programmation Ruby est un langage interprêté fait par et pour les Développeurs.
Son créateur, le programmeur Japonais Yukihiro « matz » Matsumoto a commencé à le développer à partir de 1995.
Ce dernier a rassemblé certaines fonctionnalités de ses langages préférés de l’époque (principalement Perl, Smalltalk, Eiffel, Ada et Lisp), afin d’imaginer un nouveau langage qui mêlerait astucieusement programmations impérative et fonctionnelle.
Son nom est issu d'un jeu de mot avec le langage de script Perl.

Références :

Implémentations :

 

2) Utilisation :

2.1) Syntaxe des fichiers :

Les fichiers Ruby ne tiennent pas compte des espaces et des tabulations, mais il est préférable pour des raisons de lisibilité de bien indenter vos fichiers.

2.2) Inclusions :

Inclus les fonctions, classes, méthodes, etc. d'un fichier source Ruby dans un autre :
require <fichier>.rb

2.3) Test d'instructions :

 

3) Instructions de contrôle :

3.1) La dernière action d'un bloc renvoie sa valeur :

un = deux = trois = ""
=> ""

3.2) Tests :


3.3) Sélection de cas (case):

case x
	when 1
		<inst°s>
		...
	when n
		<inst°s>
		...
end

3.4) Boucle for :

(1..10).each do |i|
	puts i
end

3.5) Boucle loop :

loop do
	break if <cond°>
end
Voir aussi : La gestion des boucles en ruby

3.6) Boucle while :

while <cond°>
	...
end

begin
	...
end while <cond°>

f=2
puts f=f+2 while f < 10

3.7) Exceptions :

L'Exception par défaut est :
begin
	...
rescue ZeroDivisionError
	...
	exit
rescue IOError
	...
	exit
rescue TypeError
	#Ruby n'est pas typé, mais possible (paramètres de méthode)
	...
	exit
rescue
	#Toutes les autres
	puts "Exception survenue: #{$!}"
	...
	exit
ensure
	#Toujours executé
end

begin
	...
rescue exception
	#Toutes
	puts "erreur : #{exception.message}"
end

Exemple de TypeError :
def factorial(n)
	if n == 0
		1
	else
		n * factorial(n-1)
	end
end

numbers = [1,2,3]

begin
	puts factorial(numbers)
rescue TypeError
	puts "une erreur de type est arrivée : #{$!}"
end


puts(numbers.map { |n| factorial(n) })

 

4) Chaînes / caractères :

4.1) Chaînes :

4.2) Caractères :


4.3) Encodage :

Version de Ruby >= 1.9
4.3.1) Transcodage :
latin1_resume = "Résumé"
transcoded_utf8_resume = latin1_resume.encode("UTF-8")
# now correctly changed to UTF-8
puts transcoded_utf8_resume.encoding.name # ==> UTF-8
puts transcoded_utf8_resume.bytesize # ==> 8
puts transcoded_utf8_resume.valid_encoding? # ==> true
4.3.2) Parcours :
Version de Ruby >= 1.9
  • String :
  • each() a été retiré de String et String n'est plus Enumerable.
    à la place :
    utf8_resume.each_byte do |byte|
    	puts byte
    end

    utf8_resume.each_char do |char|
    	puts char
    end

    Parcours de chaque caractère :
    each_codepoint #(ascii)
    Parcours de chaque ligne :
    each_line
    On retrouve Enumérable :
    p utf8_resume.bytes.first(3)
    # ==> [82, 195, 169]

    p utf8_resume.chars.find {
    	|char| char.bytesize > 1
    }
    # ==> "é"

    p utf8_resume.codepoints.to_a
    # ==> [82, 233, 115, 117, 109, 233]

    Maintenant le reverse de mots marche même avec les accents :
    p utf8_resume.lines.map { |line| line.reverse }
    # >> ["émuséR"]
  • Autres :
  • TODO

4.4) Formats de date et d'heure :

Les dates peuvent être formatées avec l'instruction suivante :
<objet_time>.strftime(<string>) #=> <tring>
Où le paramètre chaîne peut contenir les valeurs suivantes :
%a Nom abrégé jour de semaine ('Sun')
%A Nom de jour de semaine complète ('Sunday')
%b Nom abrégé du mois ('Jan')
%B Nom complet du mois ('January')
%c Représentation locale préférée de l'heure et de la date
%c Siecle (20 en 2010)
%d Jour du mois (01..31)
%D Date (%m/%d/%y)
%e Jour du mois, complété par des blancs ( 1..31)
%H Heure de la journée, horloge 24 heures (00..23)
%I Heure de la journée, horloge 12 heures (01..12)
%j Jour de l'année (001..366)
%k Heure de la journée, horloge 24 heures, complété par des blancs ( 0..23)
%l Heure de la journée, horloge 12 heures, complété par des blancs ( 1..12)
%L Milliseconde de la seconde (000..999)
%m Mois de l'année (01..12)
%M Minute de l'heure (00..59)
%n caractère Newline (\n)
%N Fractions de secondes digits, 9 digits par défaut (nanosecondes)
   %3N millisecondes (3 digits)
   %6N microsecondes (6 digits)
   %9N nanosecondes (9 digits)
%p Indicateur de Meridien ('am' ou 'pm')
%P Indicateur de Meridien ('AM' ou 'PM')
%r Heure, horloge 12 heures (%I:%M:%S %p)
%R Heure, horloge 24 heures (%H:%M)
%s Nombre de secondes depuis 1970-01-01 00:00:00 UTC.
%S Seconde de la minute (00..60)
%t Caractère tabulation (\t)
%T Heure, horloge 24 heures (%H:%M:%S)
%u Jour de la semaine en decimal, Lundi étant 1 (1..7)
%U Numéro de semaine, année courante (le 1er Dimanche est le 1er jour de la 1ère semaine) (00..53)
%v Date O.S. VMS (%e-%b-%Y)
%V Numéro de semaine de l'année, d'après ISO 8601 (01..53)
%W Numéro de semaine de l'année courante (le 1er Lundi est le 1er jour de la 1ère semaine) (00..53)
%w Jour de la semaine (Dimanche est 0) (0..6)
%x Représentation préférée pour la date seule, pas d'heure
%X Représentation préférée pour l'heure seul, pas de date
%y Année sans siècle (00..99)
%Y Année avec siècle
%z Fuseau horaire en décalage de UTC (p. ex. +0900)
%Z Nom du fuseau horaire
%% Caractère litéral '%'

 

5) Fondements du langage :

 

6) Fonctions / Méthodes / Opérateurs :

6.1) Méthodes :

  • Définition :
  • Leur nom est en minuscules, les mots qui composent leur nom sont séparés par des tirets soulignés.
    	def <nom_methode>
    		...
    	end
    

  • Accesseurs
  • def prenom=(p_prenom)
    	@prenom=p_prenom
    end
    Équivaut à :
    attr_writer :prenom

    attr_accessor
    =>attr_reader + attr_writer

  • Méthodes en écriture
  • ! à la fin d'une méthode => modifie la variable plutôt que de retourner la valeur modifiée.

  • Méthodes utiles :
    • Conversion en chaîne
    • Possible sur tous les objets :
      a=1
      a.to_s
      
      <Fixnum>.to_s

    • Entree / sortie standard
    • puts #=> affiche
      gets #=> saisie

    • génération de nombres pseudo-aléatoires :
    • Nombre à 15 décimales :
      rand #=> Float [0,1]
      Entier :
      rand(n) #=> Fixnum [0, n-1]

6.2) Opérateurs :

  • Puissance :
  • **
    x **= 3 #<=>
    x = x**3

 

7) Objets :

7.1) Tableaux :

  • Ils peuvent être mixtes, ils sont triables, et peuvent contenir des doublons :
  • tableau_mixte = ["a", 1, :c, 3.14]
  • Opérations :
  • lettres = ["a", "b", "c", "d"]
    
    #Soustraction
    lettres - ["a", "b"]
    
    => ["c", "d"]

    lettres * 2
    => ["c", "d", "c", "d"]

    lettres + ["e", "f"]
    => ["c", "d", "c", "d", "e", "f"]

    Ajout d'un seul élément :
    <tableau> << <un seul elt>
    #exemple :
    lettres << "g"
    
    => ["c", "d", "c", "d", "e", "f", "g"]

  • Sortie du tableau (comme une pile) :
  • lettres.pop
    #=> "g"
    
    lettres.pop
    #=> "f"
    
    lettres.pop
    #=> "e"
    

  • Insertion en tête :
  • lettres.unshift("a")
    => ["a", "c", "d", "c", "d"]

  • Recherche :
  • lettres.empty?
    => false

    lettres.include?("c")
    => true

  • Concaténation :
  • .concat(<tableau>)

  • Tri :
  • Tri alphabétique (ordre lexical) :
    .sort
    # Exemple fait un table de kids
    kids = Array.new
    # each kid is a Hash
    kids << {'name'=>'Cliff', 'age'=>10}
    kids << {'name'=>'Bill', 'age'=>6}
    kids << {'name'=>'Andy', 'age'=>13}
    
    # the kids sorted by name
    kids.sort_by { |k| k['name'] }
    
    # the kids sorted by age
    kids.sort_by { |k| k['age'] }
    

    Retirer les doublons :
    .uniq

  • Parcours
  • Parcours avec index :
    .each_with_index do |elt, i|
    	puts("tab[#{i}]=#{elt}")
    end
    
    .each_with_index do |array=[Array de vars], i|
    	...
    end
    

  • Collecter :
  • ["hi", "there"].collect{ |value|
    	value.capitalize
    }
    => MAJ dans l'objet tableau

7.2) Hash :

.each_key
.each_value
.each do |key, value|
.invert #(clés <==> valeurs)

 

8) jruby :

Installation :
api jruby1.2
gem install activerecord-jdbc-adapter

Utilisation :
jruby -e 'p $:'