SlideShare une entreprise Scribd logo
1  sur  45
Télécharger pour lire hors ligne
Ruby
Le serment
“Je m’engage à interrompre cette présentation
avec des remarques et des questions, quelles que
soient mes connaissances en programmation.”
irb
L’arme secrète des Rubyistes
Le REPL

Ruby fourni un outil Read-Eval-Print-Loop appelé irb
  en gros, on lui envoie du Ruby et il donne le résultat
C’est un excellent outil pour apprendre le langage
  Ça devient un outil très puissant pour manipuler des
  données quand on est dans un framework
faites vous du bien et jouez beaucoup avec irb
Utiliser irb
 taper irb pour le lancer
                            $ irb
 Vous entrez des            >> 1 + 2
 expressions Ruby           => 3
                            >> "pizza".capitalize
                            => "Pizza"
 irb répond avec le         >> %w[G U L P].reverse
 résultat                   => ["P", "L", "U", "G"]
                            >> _.join("-")
 _ contient le dernier      => "P-L-U-G"
                            >> exit
 résultat
 On sort avec exit ou ^D
Ruby est généraliste
Multi-plateformes


 fonctionne sous Linux et variantes d’Unix
   y compris Mac OS X où il est installé par défaut
 fonctionne aussi sous Windows, mais le reste de
 l’écosystème est moins compatible
Scripts et admin système


très proche de Perl et Python dans les cas d’usage
on trouve des micro-scripts très spécialisés
mais aussi des programmes complets et autonomes
Propice aux framework

Sa souplesse et sa modularité ont permis de créer de
nombreux framework :
  Ruby on Rails, Merb, … (frameworks web complets)
  Sinatra, Ramaze, … (micro-frameworks web)
  Anemone (web spider), Test::Unit, RSpec,
  Cucumber (frameworks de tests)
Multi-implémentations

 MRI (Matz Ruby Interpreter) l’officiel <= 1.8
 YARV (Yet Another Ruby Virtual machine) >= 1.9
 JRuby, MacRuby, IronRuby, BlueRuby, …
 Rubinius, MagLev, …

Une véritable spec ISO est en cours de
finalisation
Ruby est orienté humain

La syntaxe de Ruby est conçue pour faciliter
l’expression de la pensée du développeur.
Très proche de l’anglais parlé.
Les noms sont signifiants et cohérents
Concis et précis


 pas de caractères
 inutiles, si possible   puts "Qui commande les pizzas ?"

                         puts "On est 15 à en vouloir"
   fin de lignes
   parenthèses
Lisible

                      3.times { print "Pizza !"}



 les commandes
 s’enchaînent comme   exit unless "menu".include? "nu"


 les mots dans une
 phrase               ['Pizza', 'Ordis'].each do |truc|
                        puts truc
                      end
Expressif et prévisible
                          door.check_if_opened
                          # vs
                          door.open?

                          friend.set_first_name('Vincent')
 les méthodes sont        # vs
                          friend.first_name = 'Vincent'
 prévisibles
                          # Array
 il y a des conventions   ['olive','anchois'].include? 'olive'

 de nommage               # Range
                          (0..9).include? 3
 cohérentes entre les     # String
 classes et librairies    "PLUG".include? "LUG"

                          # IPAddr
                          net1 = IPAddr.new "192.168.2.0/24"
                          net2 = IPAddr.new "192.168.2.1"
                          net1.include? net2
Les types de données
Les fondamentaux de Ruby
Types et Structures
Ruby a des types communs à la plupart des langages
de programmation : String, Integer, Float, …
Ruby a 2 structures principales : Array et Hash
  Ces structures sont très souples et peuvent servir de
  files, piles, ensembles, …
Ruby a d’autres types, comme Time
Et tout ça, ce sont des objets en Ruby
String    “tplein de texten#{1 + 2}”   ‘moins ( ou ’)’
                     255               0377
Integer
                     0xFF        0b11111111
                             0.00003
 Float
                              3.0e-5
              [“Pizza”, “Bière”, “Chips”, “Canapé”]
 Array
                %w[Pizza Bières Chips Canapé]
 Hash       {“nom” => “PLUG”, “membres” => 42}
Symbol                    :lieu_reunions
Regexp /AP(?:rovence )?L(?:inux )?U(?:ser )?G(?:roup)z/
                             Time.now
 Time
         Time.local(2010, 4, 9) Time.utc(2010, 4, 9)
Manipuler des Strings
                        >>   space = "textra space   n"
String fourni :         =>   "textra space   n"
                        >>   space.strip
  changement de         =>
                        >>
                             "extra space"
                             space.rstrip
  casse                 =>   "textra space"

                        >> "James".delete("aeiou")
  nettoyage d’espaces   => "Jms"

                        >>   date = "Avril 2010"
  édition courante      =>   "Avril 2010"
                        >>   date[0..4]
                        =>   "Avril"
  indexation            >>   date[-2..-1]
                        =>   "10"
                        >>   date[/d+/]
  …                     =>   "2010"
Manipuler des Arrays
                         >>   a = [0, 1]

Array fourni :           =>
                         >>
                              [0, 1]
                              a << 2 << 3 << 4
                         =>   [0, 1, 2, 3, 4]
  ajout d’éléments       >>
                         =>
                              a.pop
                              4
                         >>   a
  retrait d’éléments     =>   [0, 1, 2, 3]

                         >>   a[1]
  indexation             =>   1
                         >>   a[1..-1]
                         =>   [1, 2, 3]
  union, intersections
                         >>   a &   [0, 2, 4, 6]
                         =>   [0,   2]
  …                      >>   a |   [42]
                         =>   [0,   1, 2, 3, 42]
Manipuler des Hashes
                          >>   h = {:a   => 1, :b => 2}

Hash fourni :             =>
                          >>
                               {:a=>1,
                               h[:b]
                                         :b=>2}

                          =>   2
  stockage clé/valeur     >>
                          =>
                               h[:c] =
                               3
                                         3

                          >>   h
  ajout/retrait de clés   =>   {:a=>1,   :b=>2, :c=>3}

                          >>   h.keys
  indexation              =>   [:a, :b, :c]
                          >>   h.values
                          =>   [1, 2, 3]
  requêtage
                          >>   h.include? :c
                          =>   true
  …                       >>   h.include? :d
                          =>   false
Conversions de types
Ruby a plein de           >>   pi = "3.1415"

méthodes de conversion
                          =>   "3.1415"
                          >>   pi.to_f
                          =>   3.1415
                          >>   pi.to_i
  Strings vers Integers   =>   3

  ou Floats               >>
                          =>
                               num = 42
                               42
                          >>   num.to_s
                          =>   "42"
  Nombres en String       >>   num.to_s(16)
                          =>   "2a"
  dans une base donnée    >>   aperos = "pizza,bieres,chips"
                          =>   "pizza, bieres, chips"
  Strings vers Arrays,    >>
                          =>
                               aperos.split(",")
                               ["pizza", "bieres", "chips"]

  et retour               >>
                          =>
                               aperos.split(",", 2)
                               ["pizza", "bieres, chips"]
                          >>   aperos.split(",").join(" | ")
                          =>   "pizza | bieres | chips"
  …
Le Duck typing
Si un object “marche” comme un canard
et si il “parle” comme un canard
alors c’est un canard
   # On vérifie si ces objets implémentent la méthode to_str()
   # à ne pas confondre avec to_s() qui fait du transtypage

   puts   ('Une chaîne'.respond_to? :to_str)
   # =>   true
   puts   (Exception.new.respond_to? :to_str)
   # =>   true
   puts   (4.respond_to? :to_str)
   # =>   false
Le contrôle de flux
Logique conditionnelle
La déclaration if
 Ruby utilise les
 conditionnelles if/elsif/
                             num = rand(10)
 else                        print "#{num}: "
                             if num == 7
 Le code est executé si        puts "Chanceux!"
                             elsif num <= 3
 la condition donne true       puts "Un peu bas."
                             else
 En Ruby, false et nil         puts "Un nombre chiant."
                             end
 sont false et tout le       # >> 2: Un peu bas.
 reste est true (0, “”,
 etc.)
Quand ça tourne mal
Ruby “lève” des erreurs
(appelées Exceptions)
quand ça tourne mal
Les objets Error on un       >> 42 / 0
                             ZeroDivisionError: divided by 0
type, un message, et           from (irb):1:in `/'
                               from (irb):1
un backtrace                   from :0


Par defaut, l’execution
s’arrête si elle n’est pas
capturée
Gestion des Exceptions

Il faut encadrer le code
incertain avec begin …     >>   begin
                           >>     n = 42 / 0
end                        >>
                           >>
                                rescue ZeroDivisionError => error
                                  n = 0
                           >>   end
Ajouter la clause rescue   =>
                           >>
                                0
                                n

pour les types d’erreur    =>   0


qu’on veut gérer
Objets et Méthodes
En Ruby, (presque) tout est un objet
Tout est un Object

À part de très très
rares exceptions, tout
                         >> -42.abs
est un Objet             => 42
                         >> 3.times { puts "Pizza" }
                         Pizza
Même un nombre est       Pizza
un Objet et on peut      Pizza
                         => 3
appeler des méthodes
dessus
Les méthodes d’un objet

  Visibilité :   Portée
    publiques      de classe
    protégées      d’instance
    privées       de Singleton
class UneClasse                 UneClasse.new.an_instance_method
  def an_instance_method        # => ”instance”
    puts "instance"             #    ”protegee”
    a_protected_method
  end                           UneClasse.a_class_method
                                # => ”methode de classe”
  def self.a_class_method
    puts "classe"               UneClasse.new.a_protected_method
  end                           # => Erreur :
                                #    protected method 'a_protected_method’
  def call_for_private          #    called for <#UneClasse:0x80125478>
    private_method
  end                           UneClasse.new.call_for_private
                                # => ”privee”
  def indirect_private(other)
    other.private_method        other = UneClasse.new
  end                           UneClasse.new.indirect_private(other)
                                # => Erreur :
  protected                     #    private method ‘a_private_method’
  def a_protected_method        #    called for <#UneClasse:0x80125478>
    puts "protegee"
  end

  private
  def private_method
    puts "privee"
  end
end
Les variables d’un objet

        Portée
          de classe
          d’instance
          locales
class Name
  def initialize(first = nil)
    self.first = first
  end                           jlecour   = Name.new("Jérémy")
                                mrmoins   = Name.new
  def first=(first)             mrmoins.first = "Christophe"
    @first = first              puts jlecour.first
  end                           puts mrmoins.first
                                # >> Jérémy
  def first                     # >> Christophe
    @first
  end
end




Variables d’instance
Elles sont privées, stockées par objet
Héritage simple
Une Classe peut           class Parent
                            def salut
déclarer un seul parent       @salutation ||= "Coucou"
                            end
Un enfant hérite du       end
                          class Enfant < Parent
comportement de ses         def initialize
                              @salutation = "Yo!"
parents                     end
                          end
Object en Ruby est le     puts Parent.new.salut
                          puts Enfant.new.salut
parent le plus élevé      # >> Coucou!
pour toutes les Classes   # >> Yo!
Méthodes dangereuses et
questions
Ruby a des conventions     >>   s = "string"
                           =>   "string"
de nommage                 >>   s.upcase
                           =>   "STRING"
Les méthodes               >>
                           =>
                                s
                                "string"
dangereuses finissent       >>
                           =>
                                s.upcase!
                                "STRING"
par !                      >>
                           =>
                                s
                                "STRING"

Les méthodes               >>   0.zero?
                           =>   true
interrogatives (qui        >>   0.0.zero?
                           =>   true
renvoient true ou false)   >>   0.00001.zero?

finissent par ?             =>   false
“Mixins”
Le moyen spécial de Ruby pour partager des
méthodes
Modules
                          module Netstring
Ruby n’a pas d’héritage     def to_netstring(*args)
                              str = to_s(*args)
multiple                      "#{str.length}:#{str},"
                            end
                          end
À la place on peut
                          class String
“mixer” un Module de        include Netstring
                          end
méthodes “dans” dans      class Integer < Numeric
une Classe                  include Netstring
                          end

On appèle ces Modules     p
                          p
                              "Pizza".to_netstring
                              42.to_netstring(2)
des “mixins”              #   >> "5:Pizza,"
                          #   >> "6:101010,"
Blocs et Itérateurs
Les Rubyistes ne supportent pas les boucles
Blocs
En Ruby, on peut
passer un bloc (du        def jusqu_a_succes
                            loop do
code) à une méthode           break if yield == :succes
                            end
                          end
  Le code du bloc est
                          jusqu_a_succes {
  dans { … } ou do …        puts "Appelé."
  end                     }
                            :succes if rand(3).zero?

                          # >> Appelé.
Cette méthode peut        # >> Appelé.
                          # >> Appelé.
executer le code fourni   # >> Appelé.

avec yield
for (…; …; …) {

                    }




Les Rubyistes ne “bouclent” pas
On “itere” plutôt
L’itérateur each()

 On laisse Ruby
 s’occuper des index    name = %w[Pizza Bières Chips]
                        name.each do |word|
                          puts word.reverse
 each() appellera le    end
                        # >> azziP
 bloc une fois pour     # >> serèiB
 chaque élément de la   # >> spihC

 collection
The map() Iterator
 map() est utilisé pour
 transformer une
 collection
                           nums = *1..5
 Chaque élément de la      p nums
                           p nums.map { |n| n ** 2 }
 collection est passé au   # >> [1, 2, 3, 4, 5]
 bloc et le résultat       # >> [1, 4, 9, 16, 25]

 remplace l’élément
 dans une nouvelle
 collection
L’itérateur select()

 select() sert à filtrer
 une collection
 Chaque élément est         nums = *1..10

 passé dans le bloc et si   p nums
                            p nums.select { |n| n % 2 == 0 }
                            # >> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
 le résultat donne true     # >> [2, 4, 6, 8, 10]

 l’élément est placé
 dans une nouvelle
 collection
Et bien plus encore !
On a à peine égratigné la surface de Ruby
Ruby est un Langage riche
Plus de 140 méthodes sur String et plus de 70 sur Array
Conversion mathématiques automatiques
Un puissant case (conditions multi-branches)
Comportements personnalisés par objet
Plus de 30 itérateurs
Puissantes capacités de réflexion
Questions ?


Merci à James Edward Gray II (@jeg2) pour m’avoir
autorisé à utiliser ses slides comme base de départ.

Contenu connexe

Tendances

Développement informatique : Algorithmique I : Récursion et arbre
Développement informatique : Algorithmique I : Récursion et arbreDéveloppement informatique : Algorithmique I : Récursion et arbre
Développement informatique : Algorithmique I : Récursion et arbreECAM Brussels Engineering School
 
Atelier Python 2eme partie par Achraf Kacimi El Hassani
Atelier Python 2eme partie par Achraf Kacimi El HassaniAtelier Python 2eme partie par Achraf Kacimi El Hassani
Atelier Python 2eme partie par Achraf Kacimi El HassaniShellmates
 
Programmation orientée objet en PHP 5
Programmation orientée objet en PHP 5Programmation orientée objet en PHP 5
Programmation orientée objet en PHP 5Kristen Le Liboux
 
Programmation orientée objet : Object, classe et encapsulation
Programmation orientée objet : Object, classe et encapsulationProgrammation orientée objet : Object, classe et encapsulation
Programmation orientée objet : Object, classe et encapsulationECAM Brussels Engineering School
 
Pourquoi Ruby et Ruby On Rais sont geniaux ?
Pourquoi Ruby et Ruby On Rais sont geniaux ?Pourquoi Ruby et Ruby On Rais sont geniaux ?
Pourquoi Ruby et Ruby On Rais sont geniaux ?Maxime Menant
 
Cours j query-id1575
Cours j query-id1575Cours j query-id1575
Cours j query-id1575kate2013
 
Breizh camp intro ruby
Breizh camp   intro rubyBreizh camp   intro ruby
Breizh camp intro rubyNicolas Ledez
 
Python avancé : Gestion d'erreurs et mécanisme d'exception
Python avancé : Gestion d'erreurs et mécanisme d'exceptionPython avancé : Gestion d'erreurs et mécanisme d'exception
Python avancé : Gestion d'erreurs et mécanisme d'exceptionECAM Brussels Engineering School
 

Tendances (19)

Développement informatique : Algorithmique I : Récursion et arbre
Développement informatique : Algorithmique I : Récursion et arbreDéveloppement informatique : Algorithmique I : Récursion et arbre
Développement informatique : Algorithmique I : Récursion et arbre
 
Atelier Python 2eme partie par Achraf Kacimi El Hassani
Atelier Python 2eme partie par Achraf Kacimi El HassaniAtelier Python 2eme partie par Achraf Kacimi El Hassani
Atelier Python 2eme partie par Achraf Kacimi El Hassani
 
Programmation orientée objet en PHP 5
Programmation orientée objet en PHP 5Programmation orientée objet en PHP 5
Programmation orientée objet en PHP 5
 
Programmation orientée objet : Object, classe et encapsulation
Programmation orientée objet : Object, classe et encapsulationProgrammation orientée objet : Object, classe et encapsulation
Programmation orientée objet : Object, classe et encapsulation
 
Pourquoi Ruby et Ruby On Rais sont geniaux ?
Pourquoi Ruby et Ruby On Rais sont geniaux ?Pourquoi Ruby et Ruby On Rais sont geniaux ?
Pourquoi Ruby et Ruby On Rais sont geniaux ?
 
Introduction au Jquery
Introduction au JqueryIntroduction au Jquery
Introduction au Jquery
 
Héritage et redéfinition de méthode
Héritage et redéfinition de méthodeHéritage et redéfinition de méthode
Héritage et redéfinition de méthode
 
Cours j query-id1575
Cours j query-id1575Cours j query-id1575
Cours j query-id1575
 
Structure de données en PHP
Structure de données en PHPStructure de données en PHP
Structure de données en PHP
 
Python après 15 ans de JAVA
Python après 15 ans de JAVAPython après 15 ans de JAVA
Python après 15 ans de JAVA
 
Cours php
Cours phpCours php
Cours php
 
Php1
Php1Php1
Php1
 
Johnny-Five : Robotique et IoT en JavaScript
Johnny-Five : Robotique et IoT en JavaScriptJohnny-Five : Robotique et IoT en JavaScript
Johnny-Five : Robotique et IoT en JavaScript
 
Breizh camp intro ruby
Breizh camp   intro rubyBreizh camp   intro ruby
Breizh camp intro ruby
 
Playing With PHP 5.3
Playing With PHP 5.3Playing With PHP 5.3
Playing With PHP 5.3
 
Python avancé : Gestion d'erreurs et mécanisme d'exception
Python avancé : Gestion d'erreurs et mécanisme d'exceptionPython avancé : Gestion d'erreurs et mécanisme d'exception
Python avancé : Gestion d'erreurs et mécanisme d'exception
 
Ns python 2
Ns python 2Ns python 2
Ns python 2
 
Python avancé : Lecture et écriture de fichiers
Python avancé : Lecture et écriture de fichiersPython avancé : Lecture et écriture de fichiers
Python avancé : Lecture et écriture de fichiers
 
Ce bon vieux propel
Ce bon vieux propelCe bon vieux propel
Ce bon vieux propel
 

En vedette

Tutoriel Ruby on Rails : apprendre Rails par l'exemple de Michael Hartl
Tutoriel Ruby on Rails : apprendre Rails par l'exemple de Michael HartlTutoriel Ruby on Rails : apprendre Rails par l'exemple de Michael Hartl
Tutoriel Ruby on Rails : apprendre Rails par l'exemple de Michael HartlMarc Maurer
 
Pourquoi Ruby on Rails est génial? (d'un point de vue non technique)
Pourquoi Ruby on Rails est génial? (d'un point de vue non technique)Pourquoi Ruby on Rails est génial? (d'un point de vue non technique)
Pourquoi Ruby on Rails est génial? (d'un point de vue non technique)Camille Roux
 
Ruby Basics
Ruby BasicsRuby Basics
Ruby BasicsSHC
 
Curso organizadores virtuales mapas conceptuales
Curso organizadores virtuales mapas conceptualesCurso organizadores virtuales mapas conceptuales
Curso organizadores virtuales mapas conceptualesAnagabygomezv
 
Café du commerce "Image prix"
Café du commerce "Image prix"Café du commerce "Image prix"
Café du commerce "Image prix"Nouveau Monde DDB
 
Tecnologías del pasado y del presente
Tecnologías del pasado y del presenteTecnologías del pasado y del presente
Tecnologías del pasado y del presentesebasquintero123
 
Actividada 2 mercadotecnia electronica
Actividada 2 mercadotecnia electronicaActividada 2 mercadotecnia electronica
Actividada 2 mercadotecnia electronicaGladys Rangel
 
22 huertas-deportes extremos experiencia personal y construccion de comunidad...
22 huertas-deportes extremos experiencia personal y construccion de comunidad...22 huertas-deportes extremos experiencia personal y construccion de comunidad...
22 huertas-deportes extremos experiencia personal y construccion de comunidad...joaquincharco
 
e-portfolios
e-portfoliose-portfolios
e-portfoliosFFFOD
 
Pharmeco : interieur-exterieur
Pharmeco : interieur-exterieurPharmeco : interieur-exterieur
Pharmeco : interieur-exterieurOriane Lafon
 
Le web2.0, une mine d'information juridique et judiciaire
Le web2.0, une mine d'information juridique et judiciaireLe web2.0, une mine d'information juridique et judiciaire
Le web2.0, une mine d'information juridique et judiciaireLedjit
 
Sistema operativo Windows 8
Sistema operativo Windows 8Sistema operativo Windows 8
Sistema operativo Windows 8AwmallyMartz
 
Programmation 1 du 3 septembre au 10 octobre 2013
Programmation 1 du 3 septembre au 10 octobre 2013Programmation 1 du 3 septembre au 10 octobre 2013
Programmation 1 du 3 septembre au 10 octobre 2013Ciné-Club Atmosphères
 
Witness curriculum 12-analyser un montage bout à bout-2011
Witness curriculum 12-analyser un montage bout à bout-2011Witness curriculum 12-analyser un montage bout à bout-2011
Witness curriculum 12-analyser un montage bout à bout-2011WITNESS
 
Reglamento institucional
Reglamento institucional Reglamento institucional
Reglamento institucional yelipao9604
 

En vedette (20)

Tutoriel Ruby on Rails : apprendre Rails par l'exemple de Michael Hartl
Tutoriel Ruby on Rails : apprendre Rails par l'exemple de Michael HartlTutoriel Ruby on Rails : apprendre Rails par l'exemple de Michael Hartl
Tutoriel Ruby on Rails : apprendre Rails par l'exemple de Michael Hartl
 
Pourquoi Ruby on Rails est génial? (d'un point de vue non technique)
Pourquoi Ruby on Rails est génial? (d'un point de vue non technique)Pourquoi Ruby on Rails est génial? (d'un point de vue non technique)
Pourquoi Ruby on Rails est génial? (d'un point de vue non technique)
 
Ruby Basics
Ruby BasicsRuby Basics
Ruby Basics
 
Curso organizadores virtuales mapas conceptuales
Curso organizadores virtuales mapas conceptualesCurso organizadores virtuales mapas conceptuales
Curso organizadores virtuales mapas conceptuales
 
Café du commerce "Image prix"
Café du commerce "Image prix"Café du commerce "Image prix"
Café du commerce "Image prix"
 
Tecnologías del pasado y del presente
Tecnologías del pasado y del presenteTecnologías del pasado y del presente
Tecnologías del pasado y del presente
 
Gilly News 2010-06
Gilly News 2010-06Gilly News 2010-06
Gilly News 2010-06
 
Actividada 2 mercadotecnia electronica
Actividada 2 mercadotecnia electronicaActividada 2 mercadotecnia electronica
Actividada 2 mercadotecnia electronica
 
22 huertas-deportes extremos experiencia personal y construccion de comunidad...
22 huertas-deportes extremos experiencia personal y construccion de comunidad...22 huertas-deportes extremos experiencia personal y construccion de comunidad...
22 huertas-deportes extremos experiencia personal y construccion de comunidad...
 
e-portfolios
e-portfoliose-portfolios
e-portfolios
 
Pharmeco : interieur-exterieur
Pharmeco : interieur-exterieurPharmeco : interieur-exterieur
Pharmeco : interieur-exterieur
 
Presentation1
Presentation1Presentation1
Presentation1
 
Le web2.0, une mine d'information juridique et judiciaire
Le web2.0, une mine d'information juridique et judiciaireLe web2.0, une mine d'information juridique et judiciaire
Le web2.0, une mine d'information juridique et judiciaire
 
Workshop L’ Université Nuage
Workshop L’ Université NuageWorkshop L’ Université Nuage
Workshop L’ Université Nuage
 
Deportes extremos
Deportes extremosDeportes extremos
Deportes extremos
 
Beaute Sauvage
Beaute SauvageBeaute Sauvage
Beaute Sauvage
 
Sistema operativo Windows 8
Sistema operativo Windows 8Sistema operativo Windows 8
Sistema operativo Windows 8
 
Programmation 1 du 3 septembre au 10 octobre 2013
Programmation 1 du 3 septembre au 10 octobre 2013Programmation 1 du 3 septembre au 10 octobre 2013
Programmation 1 du 3 septembre au 10 octobre 2013
 
Witness curriculum 12-analyser un montage bout à bout-2011
Witness curriculum 12-analyser un montage bout à bout-2011Witness curriculum 12-analyser un montage bout à bout-2011
Witness curriculum 12-analyser un montage bout à bout-2011
 
Reglamento institucional
Reglamento institucional Reglamento institucional
Reglamento institucional
 

Similaire à Introduction à Ruby

Programmation fonctionnelle
Programmation fonctionnelleProgrammation fonctionnelle
Programmation fonctionnelleGeeks Anonymes
 
Python avancé : Ensemble, dictionnaire et base de données
Python avancé : Ensemble, dictionnaire et base de donnéesPython avancé : Ensemble, dictionnaire et base de données
Python avancé : Ensemble, dictionnaire et base de donnéesECAM Brussels Engineering School
 
Trucs et astuces PHP et MySQL
Trucs et astuces PHP et MySQLTrucs et astuces PHP et MySQL
Trucs et astuces PHP et MySQLDamien Seguy
 
Les principes de base de PHP
 Les principes de base de PHP  Les principes de base de PHP
Les principes de base de PHP EL JAOUARI Ahmed
 
Formation python micro club.net
Formation python micro club.netFormation python micro club.net
Formation python micro club.netZakaria SMAHI
 
Mat lab1
Mat lab1Mat lab1
Mat lab1fouadDD
 
Calcul scientifique avec python Numpy
Calcul scientifique avec python NumpyCalcul scientifique avec python Numpy
Calcul scientifique avec python NumpyHaytam EL YOUSSFI
 
Coffee script
Coffee scriptCoffee script
Coffee scriptantho1404
 
Redis - (nosqlfr meetup #2)
Redis - (nosqlfr meetup #2) Redis - (nosqlfr meetup #2)
Redis - (nosqlfr meetup #2) Frank Denis
 
Introduction au langage python notion de base
Introduction au langage python notion de baseIntroduction au langage python notion de base
Introduction au langage python notion de basemohamedAitomar1
 
Introduction au langage python (Notion de base)
Introduction au langage python (Notion de base)Introduction au langage python (Notion de base)
Introduction au langage python (Notion de base)mohamedAitomar1
 
cours python Chapitre 3- Les types de base.pptx
cours python Chapitre 3- Les types de base.pptxcours python Chapitre 3- Les types de base.pptx
cours python Chapitre 3- Les types de base.pptxAhmathBambaMBACKE
 
Développement Web- PHP (partie I).pdf
Développement Web- PHP (partie I).pdfDéveloppement Web- PHP (partie I).pdf
Développement Web- PHP (partie I).pdfYasushiTsubakik
 

Similaire à Introduction à Ruby (20)

Programmation fonctionnelle
Programmation fonctionnelleProgrammation fonctionnelle
Programmation fonctionnelle
 
Python avancé : Ensemble, dictionnaire et base de données
Python avancé : Ensemble, dictionnaire et base de donnéesPython avancé : Ensemble, dictionnaire et base de données
Python avancé : Ensemble, dictionnaire et base de données
 
COURS_PYTHON_22.ppt
COURS_PYTHON_22.pptCOURS_PYTHON_22.ppt
COURS_PYTHON_22.ppt
 
Trucs et astuces PHP et MySQL
Trucs et astuces PHP et MySQLTrucs et astuces PHP et MySQL
Trucs et astuces PHP et MySQL
 
Une Introduction à R
Une Introduction à RUne Introduction à R
Une Introduction à R
 
Les principes de base de PHP
 Les principes de base de PHP  Les principes de base de PHP
Les principes de base de PHP
 
Php cours
Php coursPhp cours
Php cours
 
Formation python micro club.net
Formation python micro club.netFormation python micro club.net
Formation python micro club.net
 
Cours de Matlab
Cours de MatlabCours de Matlab
Cours de Matlab
 
Mat lab1
Mat lab1Mat lab1
Mat lab1
 
Calcul scientifique avec python Numpy
Calcul scientifique avec python NumpyCalcul scientifique avec python Numpy
Calcul scientifique avec python Numpy
 
Ruby Pour RoR
Ruby Pour RoRRuby Pour RoR
Ruby Pour RoR
 
Coffee script
Coffee scriptCoffee script
Coffee script
 
Audits php
Audits phpAudits php
Audits php
 
Redis - (nosqlfr meetup #2)
Redis - (nosqlfr meetup #2) Redis - (nosqlfr meetup #2)
Redis - (nosqlfr meetup #2)
 
Introduction au langage python notion de base
Introduction au langage python notion de baseIntroduction au langage python notion de base
Introduction au langage python notion de base
 
Introduction au langage python (Notion de base)
Introduction au langage python (Notion de base)Introduction au langage python (Notion de base)
Introduction au langage python (Notion de base)
 
Theme 7
Theme 7Theme 7
Theme 7
 
cours python Chapitre 3- Les types de base.pptx
cours python Chapitre 3- Les types de base.pptxcours python Chapitre 3- Les types de base.pptx
cours python Chapitre 3- Les types de base.pptx
 
Développement Web- PHP (partie I).pdf
Développement Web- PHP (partie I).pdfDéveloppement Web- PHP (partie I).pdf
Développement Web- PHP (partie I).pdf
 

Introduction à Ruby

  • 2. Le serment “Je m’engage à interrompre cette présentation avec des remarques et des questions, quelles que soient mes connaissances en programmation.”
  • 4. Le REPL Ruby fourni un outil Read-Eval-Print-Loop appelé irb en gros, on lui envoie du Ruby et il donne le résultat C’est un excellent outil pour apprendre le langage Ça devient un outil très puissant pour manipuler des données quand on est dans un framework faites vous du bien et jouez beaucoup avec irb
  • 5. Utiliser irb taper irb pour le lancer $ irb Vous entrez des >> 1 + 2 expressions Ruby => 3 >> "pizza".capitalize => "Pizza" irb répond avec le >> %w[G U L P].reverse résultat => ["P", "L", "U", "G"] >> _.join("-") _ contient le dernier => "P-L-U-G" >> exit résultat On sort avec exit ou ^D
  • 7. Multi-plateformes fonctionne sous Linux et variantes d’Unix y compris Mac OS X où il est installé par défaut fonctionne aussi sous Windows, mais le reste de l’écosystème est moins compatible
  • 8. Scripts et admin système très proche de Perl et Python dans les cas d’usage on trouve des micro-scripts très spécialisés mais aussi des programmes complets et autonomes
  • 9. Propice aux framework Sa souplesse et sa modularité ont permis de créer de nombreux framework : Ruby on Rails, Merb, … (frameworks web complets) Sinatra, Ramaze, … (micro-frameworks web) Anemone (web spider), Test::Unit, RSpec, Cucumber (frameworks de tests)
  • 10. Multi-implémentations MRI (Matz Ruby Interpreter) l’officiel <= 1.8 YARV (Yet Another Ruby Virtual machine) >= 1.9 JRuby, MacRuby, IronRuby, BlueRuby, … Rubinius, MagLev, … Une véritable spec ISO est en cours de finalisation
  • 11. Ruby est orienté humain La syntaxe de Ruby est conçue pour faciliter l’expression de la pensée du développeur. Très proche de l’anglais parlé. Les noms sont signifiants et cohérents
  • 12. Concis et précis pas de caractères inutiles, si possible puts "Qui commande les pizzas ?" puts "On est 15 à en vouloir" fin de lignes parenthèses
  • 13. Lisible 3.times { print "Pizza !"} les commandes s’enchaînent comme exit unless "menu".include? "nu" les mots dans une phrase ['Pizza', 'Ordis'].each do |truc| puts truc end
  • 14. Expressif et prévisible door.check_if_opened # vs door.open? friend.set_first_name('Vincent') les méthodes sont # vs friend.first_name = 'Vincent' prévisibles # Array il y a des conventions ['olive','anchois'].include? 'olive' de nommage # Range (0..9).include? 3 cohérentes entre les # String classes et librairies "PLUG".include? "LUG" # IPAddr net1 = IPAddr.new "192.168.2.0/24" net2 = IPAddr.new "192.168.2.1" net1.include? net2
  • 15. Les types de données Les fondamentaux de Ruby
  • 16. Types et Structures Ruby a des types communs à la plupart des langages de programmation : String, Integer, Float, … Ruby a 2 structures principales : Array et Hash Ces structures sont très souples et peuvent servir de files, piles, ensembles, … Ruby a d’autres types, comme Time Et tout ça, ce sont des objets en Ruby
  • 17. String “tplein de texten#{1 + 2}” ‘moins ( ou ’)’ 255 0377 Integer 0xFF 0b11111111 0.00003 Float 3.0e-5 [“Pizza”, “Bière”, “Chips”, “Canapé”] Array %w[Pizza Bières Chips Canapé] Hash {“nom” => “PLUG”, “membres” => 42} Symbol :lieu_reunions Regexp /AP(?:rovence )?L(?:inux )?U(?:ser )?G(?:roup)z/ Time.now Time Time.local(2010, 4, 9) Time.utc(2010, 4, 9)
  • 18. Manipuler des Strings >> space = "textra space n" String fourni : => "textra space n" >> space.strip changement de => >> "extra space" space.rstrip casse => "textra space" >> "James".delete("aeiou") nettoyage d’espaces => "Jms" >> date = "Avril 2010" édition courante => "Avril 2010" >> date[0..4] => "Avril" indexation >> date[-2..-1] => "10" >> date[/d+/] … => "2010"
  • 19. Manipuler des Arrays >> a = [0, 1] Array fourni : => >> [0, 1] a << 2 << 3 << 4 => [0, 1, 2, 3, 4] ajout d’éléments >> => a.pop 4 >> a retrait d’éléments => [0, 1, 2, 3] >> a[1] indexation => 1 >> a[1..-1] => [1, 2, 3] union, intersections >> a & [0, 2, 4, 6] => [0, 2] … >> a | [42] => [0, 1, 2, 3, 42]
  • 20. Manipuler des Hashes >> h = {:a => 1, :b => 2} Hash fourni : => >> {:a=>1, h[:b] :b=>2} => 2 stockage clé/valeur >> => h[:c] = 3 3 >> h ajout/retrait de clés => {:a=>1, :b=>2, :c=>3} >> h.keys indexation => [:a, :b, :c] >> h.values => [1, 2, 3] requêtage >> h.include? :c => true … >> h.include? :d => false
  • 21. Conversions de types Ruby a plein de >> pi = "3.1415" méthodes de conversion => "3.1415" >> pi.to_f => 3.1415 >> pi.to_i Strings vers Integers => 3 ou Floats >> => num = 42 42 >> num.to_s => "42" Nombres en String >> num.to_s(16) => "2a" dans une base donnée >> aperos = "pizza,bieres,chips" => "pizza, bieres, chips" Strings vers Arrays, >> => aperos.split(",") ["pizza", "bieres", "chips"] et retour >> => aperos.split(",", 2) ["pizza", "bieres, chips"] >> aperos.split(",").join(" | ") => "pizza | bieres | chips" …
  • 22. Le Duck typing Si un object “marche” comme un canard et si il “parle” comme un canard alors c’est un canard # On vérifie si ces objets implémentent la méthode to_str() # à ne pas confondre avec to_s() qui fait du transtypage puts ('Une chaîne'.respond_to? :to_str) # => true puts (Exception.new.respond_to? :to_str) # => true puts (4.respond_to? :to_str) # => false
  • 23. Le contrôle de flux Logique conditionnelle
  • 24. La déclaration if Ruby utilise les conditionnelles if/elsif/ num = rand(10) else print "#{num}: " if num == 7 Le code est executé si puts "Chanceux!" elsif num <= 3 la condition donne true puts "Un peu bas." else En Ruby, false et nil puts "Un nombre chiant." end sont false et tout le # >> 2: Un peu bas. reste est true (0, “”, etc.)
  • 25. Quand ça tourne mal Ruby “lève” des erreurs (appelées Exceptions) quand ça tourne mal Les objets Error on un >> 42 / 0 ZeroDivisionError: divided by 0 type, un message, et from (irb):1:in `/' from (irb):1 un backtrace from :0 Par defaut, l’execution s’arrête si elle n’est pas capturée
  • 26. Gestion des Exceptions Il faut encadrer le code incertain avec begin … >> begin >> n = 42 / 0 end >> >> rescue ZeroDivisionError => error n = 0 >> end Ajouter la clause rescue => >> 0 n pour les types d’erreur => 0 qu’on veut gérer
  • 27. Objets et Méthodes En Ruby, (presque) tout est un objet
  • 28. Tout est un Object À part de très très rares exceptions, tout >> -42.abs est un Objet => 42 >> 3.times { puts "Pizza" } Pizza Même un nombre est Pizza un Objet et on peut Pizza => 3 appeler des méthodes dessus
  • 29. Les méthodes d’un objet Visibilité : Portée publiques de classe protégées d’instance privées de Singleton
  • 30. class UneClasse UneClasse.new.an_instance_method def an_instance_method # => ”instance” puts "instance" # ”protegee” a_protected_method end UneClasse.a_class_method # => ”methode de classe” def self.a_class_method puts "classe" UneClasse.new.a_protected_method end # => Erreur : # protected method 'a_protected_method’ def call_for_private # called for <#UneClasse:0x80125478> private_method end UneClasse.new.call_for_private # => ”privee” def indirect_private(other) other.private_method other = UneClasse.new end UneClasse.new.indirect_private(other) # => Erreur : protected # private method ‘a_private_method’ def a_protected_method # called for <#UneClasse:0x80125478> puts "protegee" end private def private_method puts "privee" end end
  • 31. Les variables d’un objet Portée de classe d’instance locales
  • 32. class Name def initialize(first = nil) self.first = first end jlecour = Name.new("Jérémy") mrmoins = Name.new def first=(first) mrmoins.first = "Christophe" @first = first puts jlecour.first end puts mrmoins.first # >> Jérémy def first # >> Christophe @first end end Variables d’instance Elles sont privées, stockées par objet
  • 33. Héritage simple Une Classe peut class Parent def salut déclarer un seul parent @salutation ||= "Coucou" end Un enfant hérite du end class Enfant < Parent comportement de ses def initialize @salutation = "Yo!" parents end end Object en Ruby est le puts Parent.new.salut puts Enfant.new.salut parent le plus élevé # >> Coucou! pour toutes les Classes # >> Yo!
  • 34. Méthodes dangereuses et questions Ruby a des conventions >> s = "string" => "string" de nommage >> s.upcase => "STRING" Les méthodes >> => s "string" dangereuses finissent >> => s.upcase! "STRING" par ! >> => s "STRING" Les méthodes >> 0.zero? => true interrogatives (qui >> 0.0.zero? => true renvoient true ou false) >> 0.00001.zero? finissent par ? => false
  • 35. “Mixins” Le moyen spécial de Ruby pour partager des méthodes
  • 36. Modules module Netstring Ruby n’a pas d’héritage def to_netstring(*args) str = to_s(*args) multiple "#{str.length}:#{str}," end end À la place on peut class String “mixer” un Module de include Netstring end méthodes “dans” dans class Integer < Numeric une Classe include Netstring end On appèle ces Modules p p "Pizza".to_netstring 42.to_netstring(2) des “mixins” # >> "5:Pizza," # >> "6:101010,"
  • 37. Blocs et Itérateurs Les Rubyistes ne supportent pas les boucles
  • 38. Blocs En Ruby, on peut passer un bloc (du def jusqu_a_succes loop do code) à une méthode break if yield == :succes end end Le code du bloc est jusqu_a_succes { dans { … } ou do … puts "Appelé." end } :succes if rand(3).zero? # >> Appelé. Cette méthode peut # >> Appelé. # >> Appelé. executer le code fourni # >> Appelé. avec yield
  • 39. for (…; …; …) { } Les Rubyistes ne “bouclent” pas On “itere” plutôt
  • 40. L’itérateur each() On laisse Ruby s’occuper des index name = %w[Pizza Bières Chips] name.each do |word| puts word.reverse each() appellera le end # >> azziP bloc une fois pour # >> serèiB chaque élément de la # >> spihC collection
  • 41. The map() Iterator map() est utilisé pour transformer une collection nums = *1..5 Chaque élément de la p nums p nums.map { |n| n ** 2 } collection est passé au # >> [1, 2, 3, 4, 5] bloc et le résultat # >> [1, 4, 9, 16, 25] remplace l’élément dans une nouvelle collection
  • 42. L’itérateur select() select() sert à filtrer une collection Chaque élément est nums = *1..10 passé dans le bloc et si p nums p nums.select { |n| n % 2 == 0 } # >> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] le résultat donne true # >> [2, 4, 6, 8, 10] l’élément est placé dans une nouvelle collection
  • 43. Et bien plus encore ! On a à peine égratigné la surface de Ruby
  • 44. Ruby est un Langage riche Plus de 140 méthodes sur String et plus de 70 sur Array Conversion mathématiques automatiques Un puissant case (conditions multi-branches) Comportements personnalisés par objet Plus de 30 itérateurs Puissantes capacités de réflexion
  • 45. Questions ? Merci à James Edward Gray II (@jeg2) pour m’avoir autorisé à utiliser ses slides comme base de départ.