Approfondissement du langage (Ruby)

Filtrage des données

  • Par ordre décroissant au dépend des valeurs :
puts tableau_hash.sort { | a,b | b[1]<=>a[1] }

Les blocs

  • Les blocs sont des ensembles d'instructions formant un tout :
mon_block { puts "enterieur du block" }
  • Une méthode peut invoquer le bloc qui lui a été associé, une ou plusieurs fois, au moyen de l’instruction yield :
def deux_fois
puts "Début"
yield
yield
puts "Fin"
end
 
deux_fois { puts "Hello" }

Nous obtenons :

Début
Hello
Hello
Fin
  • Il est possible de passer des paramètres à l’instruction yield
def deux_fois
        puts 'debut'
        yield("appel",1)
        yield("maison",2)
        puts 'fin'
end
 
deux_fois { |a,b| puts "ello #{a} puis #{b}" }

Nous obtenons :

debut
ello appel puis 1
ello maison puis 2
fin
  • L'objet Proc permet de sauvegarder et d’exécuter par la suite des blocs
p = Proc.new{ |x , y| x + y }
p.call(12 , 4)

Accès aux fichiers

  • Lecture :
# Lors d'un nouveau fichier 
#File.new('test.txt', 'r') do |ligne|
# Lorsqu'il est déjà existant 
File.open('test.txt', 'r') do |ligne|
   puts ligne
end
  • Écriture d'un fichier
# Lors d'un nouveau fichier 
#File.new('test.txt', 'w') do |ligne|
# Lorsqu'il est déjà existant 
File.open('test.txt', 'w') do |ligne|
   ligne << "une ligne"
end
  • Accès en lecture ligne par ligne :
IO.readlines('test.txt').each do |ligne|
   puts ligne
end
  • Placer le contenu d'un fichier dans une variable :
# De type chaine
contenu = IO.read('fichier.txt')
 
# De type tableau 
contenu = IO.readlines('fichier.txt')
  • Est-ce que le fichier est vide ?
puts File.zero?("fichier.txt")

Manipuler les dates

  • Différencier les dates :
puts File.mtime(fichier) < Time.mktime (annee,mois,jours)
  • Définir une date et la formater :
t = Time.mktime(annee,mois,jour,heure,minutes,secondes,microsecondes)
 
# Convertir la date dans un autre format :
t.strftime('%H:%M:%S,%L')

Documentation sur la classe Time

Les classes

  • Déclarer une classe :
class Livre
   # Constructeur d'une classe : 
   def initialize ( titre , auteur , nbpages )
      @titre = titre
      @auteur = auteur
      @nbpages = nbpages
   end
 
# Accessibilité des membres :
   def fonc1 ... end
   def fonc2 ... end
   def fonc3 ... end
 
   # par défaut les méthodes sont publiques :
   public :fonc1, :fonc2
   # Les méthodes peuvent être utilisé que par la classe elle-même et celles dérivées 
   protected :fonc3
end

Expression régulière

On peut s'aider du site Regex101 pour créer les patterns.

  • Vérifier la présence d'un élément :

Vérifions qu'il y a bien un prénom dans la phrase ci-dessous.

phrase = "je m'appel Bruno et j'ai 22 ans."
if phrasee =~ /[A-Z][a-z]+/ then
   puts "vraie"
end
vraie
  • Filtrer les données d'un élément :
phrase = "je m'appel Bruno et j'ai 22 ans."
if phrase =~ /([A-Z][a-z]+).* ([0-9]+)/ then
   prenom = $1
   age = $2
end
  • Par substitution :
# Récupérer des valeurs dans une chaîne :
filtre = ligne.sub(/^([^ ]+) [^"]+"[^ ]+ ([^ ]+)/, "\\1,\\2,\\3")
filtre = filtre.split(',')
 
# Remplacer des caractères dans une chaîne :
s = 'Bonjour'
s1 = s.sub(/[aeiouy]/ , '*')     #> 'B*njour'
s2 = s.gsub(/[aeiouy]/ , '*')    #> 'B*nj**r'

On notera qu'il existe des méta-caractères qui devront être précedé d'un “\” pour être lu :

. | ( ) [ ] { } \ ˆ $ * + /
Séquence Utilité
\d Numériques
\D Non numériques
\w Tous les caractères
\W Aucun caractères
\s Caractères séparateur
\S Sans caractères séparateur
[:alnum:] Caractères alphanumériques
[:alpha:] Lettres minuscules et majuscules
[:blank:] Espace et tabulation
[:lower:] Minuscules
[:upper:] Majuscules
[:punct:] sauf espace et alphanumériques
[:space:] Espaces
[:xdigit:] Caractères des nombres hexadécimaux

Installer des modules

Pour personnaliser d'avantages son code, il faut parfois faire appel à des modules externe à ruby. Ce site permettra sans doute de répondre au bonheur de chacun.

Voici comment les importer :

gem install <module>

Interagir avec une page web

require "open-uri"
 
open("http://bruno-tatu.com") do |i|
  puts i.read.scan(/<img .* src=\"(.*)\"/)
end