# Ceci est un commentaire=begin
Ceci est un commentaire multiligne
Personne ne les utilise
Vous devriez en faire de même
=end# Tout d'abord : Tout est un objet.# Les nombres sont des objets3.class#=> Fixnum3.to_s#=> "3"# Les opérateurs de base1+1#=> 28-1#=> 710*2#=> 2035/5#=> 7# Les opérateurs sont juste des raccourcis# pour appeler une méthode sur un objet1.+(3)#=> 410.*5#=> 50# Les valeurs spéciales sont des objetsnil# Nultrue# Vraifalse# Fauxnil.class#=> NilClasstrue.class#=> TrueClassfalse.class#=> FalseClass# Égalité1==1#=> true2==1#=> false# Inégalité1!=1#=> false2!=1#=> true!true#=> false!false#=> true# à part false lui-même, nil est la seule autre valeur 'false'!nil#=> true!false#=> true!0#=> false# Plus de comparaisons1<10#=> true1>10#=> false2<=2#=> true2>=2#=> true# Les chaînes de caractères sont des objets'Je suis une chaîne de caractères'.class#=> String"Je suis également une chaîne de caractères".class#=> Stringplaceholder="utiliser l'interpolation de chaîne de caractères""Je peux #{placeholder} quand j'utilise les guillemets"#=> "Je peux utiliser l'interpolation de chaîne de caractères quand j'utilise les guillemets"# Affichez un messageputs"J'affiche à l'écran!"# Variablesx=25#=> 25x#=> 25# Notez que l'affectation retourne la valeur affectée.# Cela signifie que vous pouvez affecter plusieurs fois de suite :x=y=10#=> 10x#=> 10y#=> 10# Par convention, utilisez la notation underscore# pour nommer les variablessnake_case=true# Utilisez des noms de variable explicitespath_to_project_root='/nom/correct/'path='/mauvais/nom/'# Symboles (aussi des objets)# Les symboles sont immuables, constants,# réutilisables et représentés en interne# par une valeur entière. Ils sont souvent# utilisés à la place des chaînes de caractères# pour transmettre efficacement des valeurs# spécifiques ou significatives:pending.class#=> Symbolstatus=:pendingstatus==:pending#=> truestatus=='pending'#=> falsestatus==:approved#=> false# Tableaux# Ceci est un tableauarray=[1,2,3,4,5]#=> [1, 2, 3, 4, 5]# Les tableaux contiennent différents types d'élément.[1,"hello",false]#=> [1, "hello", false]# Les tableaux peuvent être indexés# Du débutarray[0]#=> 1array[12]#=> nil# Comme les opérateurs, la syntaxe [var] est juste un raccourci# pour appeler la méthode [] d'un objetarray.[]0#=> 1array.[]12#=> nil# Depuis la finarray[-1]#=> 5# Avec un index de début et de finarray[2,4]#=> [3, 4, 5]# Ou avec un intervallearray[1..3]#=> [2, 3, 4]# Ajoutez un élément au tableau comme ceciarray<<6#=> [1, 2, 3, 4, 5, 6]# Les Hash sont des dictionnaires Ruby contenant des paires de clé/valeur.# Les Hash sont délimitées par des accolades :hash={'color'=>'green','number'=>5}hash.keys#=> ['color', 'number']# Les Hash retournent la valeur# en utilisant la clé associée à la valeur :hash['color']#=> 'green'hash['number']#=> 5# Recherchez une clé inexistante dans une Hash retourne nil :hash['nothing here']#=> nil# Depuis Ruby 1.9, Une syntaxe spécifique est apparue# en utilisant les symboles comme clés :new_hash={defcon:3,action:true}new_hash.keys#=> [:defcon, :action]# Astuce : Les tableaux et les Hash sont dénombrables# Ils partagent un certain nombre de méthodes pratiques# telle que each, map, count, etc...# Structures de contrôleiftrue"si instruction"elsiffalse"autrement si, facultatif"else"autrement, également facultatif"endforcompteurin1..5puts"itération #{compteur}"end#=> itération 1#=> itération 2#=> itération 3#=> itération 4#=> itération 5# CEPENDANT, l'usage de la boucle for est très rare.# À la place, utilisez la méthode "each"# et passez lui un bloc de code.# Un bloc de code est un ensemble d'instructions# que vous pouvez passer à une methode comme "each".# Les blocs sont similaires aux lambdas, aux fonctions anonymes# ou encore aux closures dans d'autres langages.## La méthode "each" exécute le bloc de code# pour chaque élément de l'intervalle d'éléments.# Le bloc de code passe un paramètre compteur.# Appelez la méthode "each" avec un bloc de code comme ceci :(1..5).eachdo|compteur|puts"itération #{compteur}"end#=> itération 1#=> itération 2#=> itération 3#=> itération 4#=> itération 5# Vous pouvez également mettre un bloc de code entre accolades :(1..5).each{|compteur|puts"itération #{compteur}"}# Le contenu des structures de données peut être parcouru# en utilisant la méthode each.array.eachdo|element|puts"#{element} est une partie du tableau"endhash.eachdo|cle,valeur|puts"#{cle} est #{valeur}"endcompteur=1whilecompteur<=5doputs"itération #{compteur}"compteur+=1end#=> itération 1#=> itération 2#=> itération 3#=> itération 4#=> itération 5grade='B'casegradewhen'A'puts"Excellent"when'B'puts"Plus de chance la prochaine fois"when'C'puts"Vous pouvez faire mieux"when'D'puts"C'est pas terrible"when'F'puts"Vous avez échoué!"elseputs"Sytème de notation alternatif"end# Fonctionsdefdouble(x)x*2end# Les fonctions (et tous les blocs de code) retournent# implicitement la valeur de la dernière instruction évaluéedouble(2)#=> 4# Les paranthèses sont facultative# lorsqu'il n'y a pas d'ambiguïté sur le résultatdouble3#=> 6doubledouble3#=> 12defsum(x,y)x+yend# Les paramètres de méthode sont séparés par des virgulessum3,4#=> 7sumsum(3,4),5#=> 12# yield# Toutes les méthodes ont un argument facultatif et implicite# de type bloc de code# il peut être appelé avec le mot clé 'yield'defsurroundputs"{"yieldputs"}"endsurround{puts'Bonjour tout le monde'}# {# Bonjour tout le monde# }# Définissez une classe avec le mot clé 'class'classHumain# Une variable de classe# est partagée par toutes les instances de cette classe.@@espece="H. sapiens"# Constructeur de classedefinitialize(nom,age=0)# Affectez l'argument à la variable d'instance 'nom'# pour la durée de vie de l'instance de cette classe@nom=nom# Si le paramètre 'age' est absent,# la valeur par défaut définie dans la liste des arguments sera utilisée.@age=ageend# Une simple méthode setterdefnom=(nom)@nom=nomend# Une simple méthode getterdefnom@nomend# Une méthode de classe utilise le mot clé 'self'# pour se distinguer de la méthode d'instance.# La méthode sera alors accessible à partir de la classe# et non pas de l'instance.defself.say(msg)puts"#{msg}"enddefspecies@@speciesendend# Instanciez une classejim=Humain.new("Jim Halpert")dwight=Humain.new("Dwight K. Schrute")# Appelez quelques méthodesjim.espece#=> "H. sapiens"jim.nom#=> "Jim Halpert"jim.nom="Jim Halpert II"#=> "Jim Halpert II"jim.nom#=> "Jim Halpert II"dwight.espece#=> "H. sapiens"dwight.nom#=> "Dwight K. Schrute"# Appelez la méthode de classeHumain.say("Hi")#=> "Hi"# Les classes sont également des objets en Ruby.# Par conséquent, les classes peuvent avoir des variables d'instance.# Les variables de classe sont partagées parmi# la classe et ses descendants.# Classe parenteclassHumain@@foo=0defself.foo@@fooenddefself.foo=(valeur)@@foo=valeurendend# Classe filleclassTravailleur<HumainendHumain.foo# 0Travailleur.foo# 0Humain.foo=2# 2Travailleur.foo# 2# Les variables d'instance de classe ne sont pas partagées# avec les classes héritées.classHumain@bar=0defself.bar@barenddefself.bar=(valeur)@bar=valeurendendclassDocteur<HumainendHumain.bar# 0Docteur.bar# nil