[skateinmars ] suivez les logs en direct avec l'url ci-dessus si besoin
[skateinmars ] c'est parti alors :)
[skateinmars ] Programmation avec Ruby #2
[skateinmars ] ==========================
[skateinmars ] Introduction
[skateinmars ] ------------
[skateinmars ] Lors de la première session, nous avons vu plusieurs concepts de base de la programmation, tout en restant dans une initiation pure.
[skateinmars ] Aujourd'hui nous allons plonger plus profondément dans le monde de ruby en explorant d'autres concepts.
[skateinmars ] La plupart des choses que nous apprendrons sont des notions connues et très régulièrement utilisées dans le monde de la programmation, mais appliquées ici au monde de Ruby.
[skateinmars ] Ainsi si vous connaissez déjà ces concepts (tels que la programmation orientée objet, ou les boucles), vous pourrez découvrir la manière de les utiliser en ruby et peut-être repartir avec un nouveau langage favori !
[skateinmars ] On va commencer avec des gros manques de la première session
[skateinmars ] pas de soucis on peut y aller ?
[skateinmars ] (oui donc :))
[illovae ] yep
[skateinmars ] Paramètres optionnels
[skateinmars ] ---------------------
[skateinmars ] En guise de première partie du cours, je vais rapidement revenir sur une notion que l'on a vu durant le premier cours ruby : les fonctions.
[skateinmars ] Sachez que l'on peut lors de la création d'une fonction définir des paramètres comme étant optionnels : il ne sera pas forcément nécessaire de les renseigner.
[skateinmars ] Quelques exemples :
[skateinmars ] def dit_bonjour(nom = 'John')
[skateinmars ] puts "Bonjour #{nom} !"
[skateinmars ] end
[skateinmars ] on pourra utiliser la fonction comme ceci :
[skateinmars ] dit_bonjour('Eric')
[skateinmars ] ou comme ceci :
[skateinmars ] dit_bonjour()
[skateinmars ] def dit_bonjour(nom, prenom = 'John')
[skateinmars ] puts "Bonjour #{prenom} #{nom} !"
[skateinmars ] end
[skateinmars ] ici le premier paramètre est obligatoire, et le second optionnel
[skateinmars ] Notez que ceci est impossible :
[skateinmars ] def dit_bonjour(prenom = 'John', nom)
[skateinmars ] puts "Bonjour #{prenom} #{nom} !"
[skateinmars ] end
[skateinmars ] En effet ruby ne pourrait pas deviner que l'on souhaite renseigner uniquement le 2è paramètre.
[skateinmars ] Les paramètres optionnels sont souvent utilisés et peuvent être très utiles pour éviter la répétition de code par exemple.
[skateinmars ] petite note, vous pouvez comme la dernière fois utiliser irb, l'interpréteur ruby, pour tester ces exemples
[skateinmars ] ou copier le tout dans un fichier ruby
[skateinmars ] je vais poster des liens directs vers le code comme ceci : http://gist.github.com/raw/111737/aa7df50ff6bcd2f16d0955aa8662865d1e4fd6fa/paremetres_optionnels.rb
[skateinmars ] des questions sur les paramètres optionnels ?
[skateinmars ] (on va essayer d'avancer rapidement pour ne pas finir trop tard :])
[skateinmars ] ok, on enchaine alors
[skateinmars ] Boucles d'or
[skateinmars ] ------------
[illovae ] attend
[skateinmars ] illovae: oui ?
[illovae ] un git clone sur l'url renvoie ça : error: Can't lock ref
[skateinmars ] (notez l'humour dans mes titres parfois)
[illovae ] <:
[skateinmars ] illovae: l'adresse de répos git : git://gist.github.com/111737.git
[skateinmars ] (il contient tous les exemples du cours)
[illovae ] ah ok pardon, my mistake
[skateinmars ] (je donnerais le lien vers la liste complete des gists a la fin)
[skateinmars ] ok on continue :)
[skateinmars ] Corrigeons maintenant un gros manquement du cours précédent : les boucles.
[skateinmars ] Une boucle est une structure de contrôle, comme un `if`, mais qui contient du code qui selon certaines conditions peut se répéter plusieurs fois.
[skateinmars ] Un exemple sera plus parlant avec la boucle `for` :
[skateinmars ] for i in [1, 2, 3, 4]
[skateinmars ] puts i
[skateinmars ] end
[skateinmars ] Ce code pourrait se lire :
[skateinmars ] « Pour i égal à chaque élément du tableau [1, 2, 3, 4], exécutons "puts i" (afficher i) »
[skateinmars ] Ruby va donc parcourir notre tableau, élément par élément, et pour chaque élément exécuter le code contenu dans la boucle avec i prenant la valeur de l'élément en cours.
[skateinmars ] La boucle se termine lorsque le tableau a été parcouru en entier.
[Coolgeek ] c'est forcement un tableau ?
[skateinmars ] le résultat de ce code est donc 1 2 3 4 avec un retour à la ligne à chaque fois
[skateinmars ] Coolgeek: il faut un objet énumérable pour utiliser for
[skateinmars ] (je ferais une note plus tard pour dire que for n'est en fait pas très utilisé en ruby)
[Coolgeek ] par exemple parcourir chaque mot d'une chaine de caractere
[Coolgeek ] le for le fait pas
[Blankoworld ] Bonsoir (navré de couper, je viens d'arriver, le clavier voulait plus fonctionner) :p
[petit ] (upto power ;-)
[skateinmars ] Coolgeek: tu peut faire for i in "plop".chars
[illovae ] yo Blankoworld :)
[skateinmars ] je vais continuer avec les boucles :)
[skateinmars ] Un autre type de boucle est la boucle `while` :
[skateinmars ] nb_choux = 30
[skateinmars ] while (nb_choux < 42) do
[skateinmars ] end
[skateinmars ] Ce code signifie :
[skateinmars ] « Tant que nb_choux est inférieur à 42, exécutons le code ... »
[skateinmars ] (le gist pour les boucles est http://gist.github.com/raw/111737/c00dd980b2a868388216042a5bf6765a895dae44/boucles.rb au fait)
[skateinmars ] Les parenthèses dans le while sont optionelles mais sont parfois bienvenues pour plus de clarté
[skateinmars ] Notez que l'on doit augmenter la valeur de nb_choux nous-mêmes. Il faut faire attention avec les boucles while car elles peuvent devenir infinies si le test n'est jamais invalidé :
[skateinmars ] while true
[skateinmars ] puts "salut !"
[skateinmars ] end
[skateinmars ] Cette boucle "tournera" indéfiniment (dans irb utilisez Control+C pour arrêter son exécution).
[skateinmars ] Vous remarquerez que le `do` n'est pas nécessaire dans les boucles `while` mais peut être précisé.
[skateinmars ] ok ? :)
[Blankoworld ] C'est ce qu'on appelle test d'entrée, test de sortie ?
[Blankoworld ] un while implique ces deux tests
[Blankoworld ] "contrôle d'entrée de boucle" je crois même.
[ixzo ] ok
[skateinmars ] Blankoworld: euh, il y a simplement un test qui est exécuté à chaque passage dans la boucle
[skateinmars ] s'il réussi la boucle est exécutée, sinon on en sort et on passe au reste du code
[skateinmars ] (je sais pas is je répond à ta question)
[skateinmars ] *si
[Blankoworld ] C'était une affirmation :p
[Blankoworld ] en cours on dit "contrôle d'entrée de boucle", et contrôle de sortie de boucle. Les deux tests sont obligatoires.
[Blankoworld ] (enfin en algorithmie française)
[skateinmars ] okay
[skateinmars ] on enchaine :)
[Blankoworld ] oui.
[illovae ] ok
[skateinmars ] Il existe plusieurs façons de contrôler l'exécution d'une boucle, par exemple les instructions `next` et `break` :
[skateinmars ] for i in 1..20
[skateinmars ] if (i > 10) and (i < 15)
[skateinmars ] puts i
[skateinmars ] end
[skateinmars ] Au passage, remarquez le `1..20`, ceci est un "range" (intervalle), il contient toutes les valeurs entre le premier et le dernier nombre et nous permet de boucler dessus.
[skateinmars ] `next` permet de "sauter" une exécution de la boucle. Ici on utilise next si i est entre 10 et 15 (non inclus), on ne verra donc pas s'afficher les valeurs 11 à 14.
[skateinmars ] `break` permet de sortir complètement d'une boucle, littéralement la "casser". Ici on ne verra donc pas s'afficher 19 (ni 20).
[skateinmars ] un problème sur ce point ?
[illovae ] nop
[skateinmars ] bon alors si illovae a compris on peut y aller :)
[petit ] jusqu'ici tout va bine ...
[illovae ] ^^
[Coolgeek ] break if i>18 = if i > 18 break
[Coolgeek ] ?
[petit ] s/bine/bien/
[skateinmars ] Coolgeek: oui c'est la forme "inline"
[Coolgeek ] je suis plus habitué a la senconde forme :p
[skateinmars ] Coolgeek: la forme condensée est rubyesque :-)
[skateinmars ] Sachez toutefois que `while` et `for` sont deux types de boucles en ruby parmi de nombreuses autres, et sont finalement peu utilisées.
[skateinmars ] Passons maintenant à la grosse partie de la leçon d'aujourd'hui : la POO !
[skateinmars ] La Programmation Orientée Objet
[skateinmars ] -------------------------------
[skateinmars ] ### Objet ? ###
[skateinmars ] Nous l'avons dit lors de la première session, ruby est un langage orienté objet.
[skateinmars ] Mais qu'est-ce que cela signifie ?
[skateinmars ] Pour comprendre le concept de la programmation objet, écartons nous un peu du code.
[skateinmars ] Imaginons donc un moule à gâteaux. Lorsque j'y insère des ingrédients, je peut en sortir un gâteau.
[skateinmars ] Ce moule nous sert donc à construire des "objets" (les gâteau). C'est un guide qui détermine ce qu'est un gâteau (sa forme, sa consistence etc).
[skateinmars ] le moule est donc l'équivalent d'une classe.
[skateinmars ] je pense que la phrase a été comprise :-)
[Coolgeek ] un peu capilotracté ton analogie :p
[skateinmars ] Revenons à notre code ruby et imaginons que nous pouvons utiliser une classe Gateau pour fabriquer un gâteau au chocolat :
[skateinmars ] mon_gateau_au_chocolat = Gateau.new('chocolat')
[skateinmars ] Nous venons de créer un objet que nous stockons dans la variable `mon_gateau_au_chocolat`, et qui appartient à la classe `Gateau`.
[skateinmars ] Lors de la création de notre objet (notre gâteau) nous avons précisé l'ingrédient utilisé (le 'chocolat').
[skateinmars ] On appele la création d'un objet "instanciation", car cette opération créée une "instance de classe" (l'objet que l'on récupère dans notre variable).
[skateinmars ] En ruby une instanciation se fait donc en appelant `NomDeMaClasse.new`.
[skateinmars ] (on va créer la classe Gateau juste après)
[skateinmars ] questions ?
[Coolgeek ] je suppose que l'on peux mettre des constructeur autnat qu'on veux ?
[Coolgeek ] ou je vais trop vite ? :p
[alpimarc ] çà donne faim :p
[illovae ] alpimarc: clairement ^^
[skateinmars ] Coolgeek: plusieurs constructeurs par classe ?
[Blankoworld ] Finalement Ruby c'est du gâteau :p
[Coolgeek ] skateinmars : oui
[Coolgeek ] skateinmars : ca permet de creer un objet en passer soit un entier, ou un string, ou ...
[skateinmars ] Coolgeek: non il y a un seul constructeur mais on peut éventuellement créer une méthode de classe qui va appeler le constructeur
[Juu ] c'est pas de la tarte
[skateinmars ] on continue :)
[skateinmars ] Voila en quoi consiste la programmation orientée objet. Mais ce n'est pas tout !
[skateinmars ] Un objet possède aussi des méthodes que l'on peut appeler :
[skateinmars ] puts mon_gateau_au_chocolat.gout #=> Affiche "Ceci est un gâteau au goût chocolat !"
[skateinmars ] Une méthode est simplement une fonction 'attachée' à un objet qui a la possibilité d'accéder aux données contenues dans notre objet. Les méthodes sont définies lors de la création de la classe.
[skateinmars ] L'appel d'une méthode se fait donc simplement de cette façon : `monobjet.methode(parametres)` avec, comme pour les fonctions, des parenthèses et des arguments optionnels (en fait il n'y a pas de fonction en ruby, seulement des méthodes).
[skateinmars ] Regardons à présent comment définir une classe :
[skateinmars ] class Gateau
[skateinmars ] def initialize(ingredient)
[skateinmars ] "Ceci est un gâteau au goût #{@ingredient} !"
[skateinmars ] end
[skateinmars ] end
[skateinmars ] http://gist.github.com/raw/111737/6cb90e294caac031b3f576fdb4d67900ec6070ac/classe_gateau.rb
[skateinmars ] Regardons ce code attentivement :
[skateinmars ] Une classe possède un nom, `Gateau`. On débute la définition d'une classe avec le mot-clé class, et la terminons par end.
[skateinmars ] A l'intérieur de notre classe, nous définissons des méthodes, ici `initialize` et `gout`.
[skateinmars ] La méthode `initialize` est spéciale, c'est ce que l'on appele le 'constructeur' de la classe.
[skateinmars ] Cette méthode sera appelée lors de la création d'un objet (le `Gateau.new`) avec les paramètres fournis lors de cette création (ici l'ingrédient, 'chocolat').
[skateinmars ] Notez qu'il n'est pas nécessaire de créer une fonction initialize dans votre classe si vous ne voulez pas lui fournir d'argument lors de la création d'un objet.
[skateinmars ] Dans cette méthode `initialize`, nous utilisons la variable @ingredient et lui assignons une valeur. On accède plus tard à cette variable dans la méthode `gout`.
[Coolgeek ] ta variable gout de ton objet en en public. y'a possibilité de faire du proteger ? (accessible uniquement a la classe voir a ses heritiers) ?
[skateinmars ] je vais parler juste après des variables @var, des questions sinon ?
[skateinmars ] Coolgeek: c'est le cas par defaut comme on va le voir
[skateinmars ] Coolgeek: ingrédient plutot ?
[illovae ] on peut créer une classe dans def ?
[illovae ] et sans initialize ?
[Coolgeek ] puts mon_gateau_au_chocolat.gout #=> Affiche "Ceci est un gâteau au goût chocolat !" <== tu utilise bien la variable gout de l'objet ?
[skateinmars ] illovae: dans def ou sans def ?
[skateinmars ] Coolgeek: non, j'utilise la méthode gout
[Blankoworld ] on aurait du l'appeller afficheGout ;)
[illovae ] skateinmars: la question est plutôt, est-ce que je peut créer une classe sans avoir ni def et/ou ni initialize
[skateinmars ] Blankoworld: en effet, ou plutot à la sauce ruby affiche_gout :)
[skateinmars ] illovae: c'est ton "dans", je savais pas si c'etait une faute :p
[Coolgeek ] exact ! le resultat de la derniere commande est renvoyé, j'avais oublié (j'ai pas l'habitude de ca :p)
[skateinmars ] illovae: donc oui
[skateinmars ] on peut faire
[skateinmars ] class Vide
[skateinmars ] end
[skateinmars ] (mais c'est un peu triste :))
[illovae ] oui mais si on veut mettre des trucs dedans ?
[illovae ] faut forcément un def avec un def initialize ?
[skateinmars ] illovae: quel genre de trucs ?
[illovae ] qu'importe, je cherche à savoir si les deux premières lignes du code sont un truc à apprendre par coeur opur "faire une classe"
[skateinmars ] illovae: alors tu peut mettre du code directement à l'intérieur
[skateinmars ] qui sera exécuté quand tu défini ta classe
[skateinmars ] mais c'est peu utile
[illovae ] je pensais genre à une fonction de telechargement
[illovae ] genre class Download
[illovae ] wget blabla
[illovae ] end
[skateinmars ] illovae: le initialize est important ici, c'est le code qui sera utilisé à chaque instanciation d'une classe
[illovae ] s/wget/le_truc_qui_va_bien/
[altg ] jsuis bien a la bourre, jvai aller regarder le log
[skateinmars ] tu pourrais mettre du code dans le initialize éventuellement
[illovae ] altg: ça va on a tout juste ocommencé ;)
[illovae ] skateinmars: ok ok
[skateinmars ] illovae: mais dans ce cas la ca a peu d'interet par rapport à une fonction :)
[skateinmars ] on enchaine :)
[illovae ] ah d'accord
[skateinmars ] ### Les variables d'instance ###
[skateinmars ] Les variables commençant par un arobase `@` dans une classe sont des variables d'instance.
[skateinmars ] Une variable d'instance comme son nom l'indique a donc une valeur spécifique à un objet
[skateinmars ] mon_gateau_aux_pommes = Gateau.new('pommes')
[skateinmars ] La valeur de @ingredient sera donc différente dans nos deux objets.
[skateinmars ] (mon_gateau_au_chocolat et mon_gateau_aux_pommes)
[skateinmars ] Vous vous demandez peut-être comment accéder à vos variables d'instances ?
[skateinmars ] mon_gateau_au_chocolat.@ingredient
[skateinmars ] marche pas
[skateinmars ] ou alors
[skateinmars ] mon_gateau_au_chocolat.ingredient
[skateinmars ] Non, pas possible :(
[skateinmars ] une petit idée, et si on créait une méthode pour cela ?
[skateinmars ] On va en profiter pour créer une nouvelle classe :
[skateinmars ] class Rectangle
[skateinmars ] def initialize(hauteur, largeur)
[skateinmars ] def aire
[skateinmars ] @hauteur * @largeur
[skateinmars ] end
[skateinmars ] def hauteur
[skateinmars ] @hauteur
[skateinmars ] end
[skateinmars ] def largeur
[skateinmars ] @largeur
[skateinmars ] end
[skateinmars ] end
[skateinmars ] (gist : http://gist.github.com/raw/111737/f674311d436f9dbfd22371be8c7846b8f8fbcbc0/rectangle.rb )
[skateinmars ] on peut donc faire :
[skateinmars ] rectangle = Rectangle.new(6, 10)
[skateinmars ] rectangle.hauteur #=> 6
[Coolgeek ] la variable ingredient est privé si tu met un @ devant la definition et donc ne peux etre acceder qu'aux methode la classe ?
[skateinmars ] Coolgeek: il n'y a pas de variable d'instance publique, elle sont forcément privées
[Coolgeek ] on peux mettre d'autre variable qui sont en dehors du constructeur ?
[illovae ] moi je pige pas l'intêret de @hauteur ; puisque @hauteur = hauteur ; pourquoi ne pas écrire simplement 'hauteur' ?
[skateinmars ] tu peut utiliser des variables locales mais elles seront éphémères et contenues dans ta méthode
[Coolgeek ] skateinmars : donc pour acceder a une variable d'une class, on sera OBLIGER de creer une methode pour cela ?
[skateinmars ] Coolgeek: oui mais il y a un moyen pour pas l'écrire à la main, on va voir ca :)
[illovae ] ah d'accord
[illovae ] tu viens de répondre à ma question sk:>
[illovae ] skateinmars*
[skateinmars ] illovae: :)
[skateinmars ] donc, continuons
[skateinmars ] (n'hésitez pas a interrompre)
[skateinmars ] On pourrait même faire :
[skateinmars ] class Rectangle
[skateinmars ] @largeur = l
[skateinmars ] end
[skateinmars ] end
[skateinmars ] Notez que l'on peut modifier une classe existante simplement en la redéclarant, pour ajouter des méthodes voire modifier les méthodes existantes.
[skateinmars ] (vous pouvez donc entrer ces 2 parties de code à la suite)
[skateinmars ] Cette fonctionnalité est appelée "Monkey Patching". Elle est interressante car elle permet de modifier un code source existant (une librairie externe par exemple) sans avoir à en toucher le code existant.
[skateinmars ] Bien sur l'abus de Monkey Patching peut conduire à des comportements bizarre surtout si l'on modifie des méthodes d'une classe telles qu'initialize, c'est pourquoi on doit l'utiliser avec parcimonie.
[Coolgeek ] dans ton exemple
[skateinmars ] oui ?
[Coolgeek ] la nouvelle class Rectangle contient les ancienne et les nouvelle methode ?
[skateinmars ] Coolgeek: oui ce n'est pas une nouvelle classe, simplement une modification de la première
[mic74 ] bonsoir
[Coolgeek ] class Rectangle
[Coolgeek ] @largeur = largeur
[Coolgeek ] @aire = @hauteur * @largeur
[Coolgeek ] end
[Coolgeek ] def aire
[Coolgeek ] @hauteur * @largeur
[Coolgeek ] end
[Coolgeek ] def hauteur
[Coolgeek ] @hauteur
[Coolgeek ] end
[Coolgeek ] def largeur
[Coolgeek ] @largeur
[Coolgeek ] end
[Coolgeek ] end
[Coolgeek ] cet exemple est valable ?
[illovae ] salut mic74 :)
[skateinmars ] bonsoir mic74 regarde le topic pour un lien vers les logs si nécessaire
[alpimarc ] à quoi sert le @aire au début
[alpimarc ] pour Coolgeek
[Coolgeek ] skateinmars : http://paste.ubuntu-fr-secours.org/src-14403
[skateinmars ] Coolgeek: ton exemple est valable mais tu réutilise pas @aire ici
[illovae ] alpimarc: Ã rien je crois
[Coolgeek ] alpimarc : declarer une variable interne a l'objet en dehors des methodes
[skateinmars ] Coolgeek: oui mais tu t'en sers pas
[alpimarc ] Coolgeek: ok
[skateinmars ] Coolgeek: c'est valable sinon
[skateinmars ] def aire
[skateinmars ] @aire
[skateinmars ] end
[illovae ] alpimarc: j'ai fail'd :]
[skateinmars ] tu pouvais faire ca simplement
[skateinmars ] on continue si c'est bon
[illovae ] yup
[alpimarc ] c'est bon
[skateinmars ] (wow on va super vite par rapport a ce que j'avais prévu ^^')
[Coolgeek ] pas beaucoup de personne présente je dirais :/
[skateinmars ] ### Accesseurs ###
[skateinmars ] Revenons à nos rectangles :
[skateinmars ] rectangle.hauteur=(5)
[skateinmars ] rectangle.largeur = 10
[skateinmars ] rectangle.aire #=> 50
[skateinmars ] Plutôt sympathique. Le fait de pouvoir ajouter un espace avant le `=` est transparent.
[skateinmars ] Mais avouons que tout cela est quand même assez long à écrire et très répétitif. Ruby est pourtant censé nous permettre d'écrire peu de code pour faire ce que l'on veut !
[skateinmars ] Pas de problèmes, il y a une solution :
[skateinmars ] class Cercle
[skateinmars ] attr_accessor :rayon
[skateinmars ] end
[skateinmars ] def diametre
[skateinmars ] @rayon * 2
[skateinmars ] end
[skateinmars ] def aire
[skateinmars ] 3.14 * (@rayon ** 2)
[skateinmars ] end
[skateinmars ] def circonference
[skateinmars ] diametre * 3.14
[skateinmars ] end
[skateinmars ] end
[skateinmars ] http://gist.github.com/raw/111737/dfc9baaef9f16a7bbfe199a969376a4f35d40e54/cercle.rb
[skateinmars ] La magie se situe ici dans la méthode attr_accessor. Cette méthode créée ici 2 méthodes dans notre classe, qui seront rayon et rayon= et identiques aux méthodes décrites plus haut.
[skateinmars ] (similaires plutôt qu'identiques)
[skateinmars ] On peut donc faire :
[skateinmars ] petit_cercle = Cercle.new 10
[skateinmars ] petit_cercle.rayon #=> 10
[skateinmars ] petit_cercle.rayon = 20
[skateinmars ] Sachez qu'il existe aussi attr_reader et attr_writer qui respectivement ajoutent seulement la méthode d'accès en lecture, et seulement en écriture à une variable d'instance.
[skateinmars ] Enfin notez que ces méthodes d'accès s'appelent des accesseurs; dans des langages tels que PHP ou Java il seront souvent définis par des méthodes nommées getVariable et setVariable.
[skateinmars ] (bien que dans PHP on ait pas besoin d'accesseurs pour accéder à une variable d'instance si celle-ci est publique)
[illovae ] il est où le rayon= dans ton exemple stp ?
[Coolgeek ] en cpp aussi y'a les methodes set et get :p
[skateinmars ] illovae: il est créé quand on fait attr_accessor :rayon
[Juu ] si je veux redéclarer ma classe Cercle, sans la compléter mais en l'écrasant, c'est possible ?
[skateinmars ] Juu: j'etais en train de me poser la question justement
[Juu ] :)
[Blankoworld ] on la fait hériter de la classe Vide :p
[Blankoworld ] on l'avait faite juste avant :p
[skateinmars ] Juu: alors soit tu utilise undef pour supprimer des méthodes mais c'est pas ce qu'on veut
[skateinmars ] sinon on fait
[skateinmars ] class Object
[skateinmars ] remove_const Gateau
[skateinmars ] end
[skateinmars ] euh pardon
[skateinmars ] remove_const :Gateau
[skateinmars ] (très tordu)
[Juu ] assez
[alpimarc ] çà , c'est pas courant comme fonctionnement
[Juu ] par contre, je peux encore utiliser un objet crée précédemment
[Juu ] c'est étrange
[Blankoworld ] Question : on fait des variables d'objet. Et les variables de classe, qu'en est il ?
[skateinmars ] Blankoworld: j'en parle après :)
[Blankoworld ] ok
[Blankoworld ] (j'étais en train de tenter d'en utiliser une)
[skateinmars ] des questions sur les variables d'instance sinon ?
[ixzo ] non
[alpimarc ] si on modifie une classe après l'avoir instanciée, que devient l'objet?
[skateinmars ] alpimarc: il peut utiliser les méthodes rajoutées si on en rajoute
[alpimarc ] ok, j'aime çà ;)
[Blankoworld ] Donc le gâteau est toujours lié à son moule ? C'est une sorte de mise à jour constante.
[Coolgeek ] dans le genre code fouilli apres xD
[skateinmars ] Blankoworld: oui, c'est un peu bizarre mais heureusement on fait pas ca trop souvent :]
[skateinmars ] ### Self service ###
[skateinmars ] (cette blague la je l'aime bien)
[skateinmars ] Vous remarquerez également que l'on peut utiliser une méthode directement dans notre classe comme on peut le voir avec `diametre` ici.
[skateinmars ] Cela peut d'ailleurs parfois amener une certaines confusion : comment peut-on savoir si on utilise une méthode de notre classe ou un argument ?
[skateinmars ] Petit exemple avec notre gâteau :
[skateinmars ] class Gateau
[skateinmars ] @ingredient = ingredient #note : on aurait pu utiliser ingredient= ici
[skateinmars ] end
[skateinmars ] def ajoute_ingredient(ingredient)
[skateinmars ] puts "Nos 2 ingrédients sont : #{ingredient} et #{ingredient}"
[skateinmars ] end
[skateinmars ] end
[skateinmars ] (on va dire qu'on quitte irb et le relance pour tout remettre à zéro)
[skateinmars ] http://gist.github.com/raw/111737/ec5ffb036a71cc70f608faa9b57330d72f549187/gateau.2.rb
[skateinmars ] super_gateau = Gateau.new 'chocolat'
[skateinmars ] super_gateau.ajoute_ingredient 'pommes'
[skateinmars ] Ah bah oui, ça ne marche pas. La variable ingredient fournie en paramètre "cache" notre méthode ingredient.
[skateinmars ] On pourrait ici utiliser `@ingredient`, mais si notre méthode n'était pas un accesseur, il faudrait s'y prendre comme ceci :
[skateinmars ] class Gateau
[skateinmars ] end
[skateinmars ] end
[skateinmars ] super_gateau.ajoute_ingredient 'pommes' #=> Nos 2 ingrédients sont : chocolat et pommes
[skateinmars ] Le mot-clé `self` (parfois nommé `this` dans d'autres langages) que l'on utilise dans une méthode pour se référer à l'objet courant (qui sera donc `super_gateau` dans notre exemple).
[skateinmars ] (il manque une partie de la phrase...)
[skateinmars ] on la refait :
[skateinmars ] Le mot-clé `self` (parfois nommé `this` dans d'autres langages) est un mot-clé que l'on utilise dans une méthode pour se référer à l'objet courant (qui sera donc `super_gateau` dans notre exemple).
[skateinmars ] En ruby il n'est pas nécessaire de l'utiliser s'il n'y a pas d'ambiguité comme on l'a vu dans la méthode `circonference` de tout à l'heure, néanmoins il ne faut pas oublier son utilité !
[skateinmars ] c'est peut-etre pas super clair
[skateinmars ] et ici on voit peut-être pas non plus l'utilité de self vu qu'on pourrait nommer l'argument différemment, ou utiliser @ingredient, mais c'est à savoir
[skateinmars ] des questions ?
[Blankoworld ] on peut faire self.ingredient, mais pas mon_gateau_au_chocolat.ingredient ?
[Blankoworld ] (si c'est pas un accesseur comme tu disait)
[skateinmars ] Blankoworld: euh ouais c'est pas clair
[skateinmars ] Blankoworld: le self.truc appelle la méthode truc
[skateinmars ] pas la variable d'instance truc
[skateinmars ] (ici la méthode ingredient existe avec le attr_accessor :ingredient)
[Blankoworld ] mais self peut appeler finalement tout ce qui se trouve dans la classe, c'est ça qu'il faut retenir, n'est il pas ?
[skateinmars ] en effet
[Blankoworld ] méthode et accesseur tout au moins
[Blankoworld ] protégé, privé ou publics.
[skateinmars ] Blankoworld: mmh non ca devrait bloquer sur les methodes privees il me semble
[Blankoworld ] ah ? Puisque nous sommes dedans, nous accédons à nous même, ou bien ?
[Blankoworld ] (si même nous, n'accédons pas à nos méthodes privées, qui le ferait ?)
[skateinmars ] (en effet ca bloque sur les methodes privees)
[skateinmars ] Blankoworld: avec self c'est un peu comme si on y accédait depuis l'extérieur
[Blankoworld ] ok
[skateinmars ] ('self' représente vraiment super_gateau quoii)
[skateinmars ] -i
[skateinmars ] des questions ? vous êtes perdus ? :)
[alpimarc ] c'est bon
[illovae ] non ça va à peu près ici
[skateinmars ] continuons alors
[skateinmars ] ### Variables et méthodes de classe ###
[skateinmars ] On connait maintenant les variables d'instance, mais il peut parfois être utile de conserver des informations communes à une classe.
[skateinmars ] class Produit
[skateinmars ] attr_accessor :taux_tva #On ne modifie pas la TVA
[skateinmars ] @prix_ht = prix_ht
[skateinmars ] @taux_tva = taux_tva
[skateinmars ] end
[skateinmars ] def prix_ttc
[skateinmars ] @prix_ht * (1 + (@taux_tva / 100))
[skateinmars ] end
[skateinmars ] end
[skateinmars ] http://gist.github.com/raw/111737/f697b8aef47686ace1ad5d389675fa19c3025b14/produit.rb
[skateinmars ] on peut faire ca avec une tva de 19.5%
[skateinmars ] ballon = Produit.new(10, 19.5)
[skateinmars ] ordinateur = Produit.new(500, 19.5)
[mic74 ] Une partie de messagerie musicale a été demandée. Veuillez cliquer sur l'icône MM pour l'accepter.
[skateinmars ] C'est assez lourd et répétitif. Cherchons donc un moyen d'améliorer cela.
[skateinmars ] Une méthode ? Ce n'est pas très propre. Une variable extérieure que l'on réutiliserait ? Non plus. Une valeur en dur ? C'est ce qu'on a fait avec Pi tout à l'heure, c'est assez génant si la valeur doit être modifiable facilement.
[skateinmars ] (pi : le 3.14 dans la classe Cercle)
[skateinmars ] On va donc utiliser une variable de classe :
[skateinmars ] class Produit
[skateinmars ] @@taux_tva = 19.5
[skateinmars ] @prix_ht = prix_ht
[skateinmars ] end
[skateinmars ] def prix_ttc
[skateinmars ] @prix_ht * (1 + (@@taux_tva / 100))
[skateinmars ] end
[skateinmars ] end
[skateinmars ] http://gist.github.com/raw/111737/8a10721d06b79389e53b4f1851f1e48aea5d5ce0/produit_2.rb
[skateinmars ] C'est un peu plus clair maintenant. Notez qu'une variable de classe commence par deux arobases `@@`. Sa valeur est la même pour toutes les instances de la classe (`ballon` et `ordinateur` ici).
[skateinmars ] Sachez également qu'elle doit forcément être déclarée avant que l'on puisse l'utiliser, alors que l'on a pas besoin de déclarer une variable d'instance (sa valeur initiale étant `nil`).
[skateinmars ] (on peut aussi modifier cette variable)
[Blankoworld ] Comment afficher une variable de classe ?
[petit ] quel est l'interet? On peut apeller un emethode sans redefinir taux_tva?
[skateinmars ] Blankoworld: l'afficher ou ?
[skateinmars ] petit: on a pas besoin de redéfinir taux_tva a chaque création d'un objet
[skateinmars ] je sais pas si je répond bien à ta question ?
[Juu ] le attr_reader ne permet que d'afficher la valeur de la variable, pas de la modifier, c'est ça ?
[skateinmars ] on peut utiliser @@taux_tva dans toutes nos méthodes après
[petit ] si
[skateinmars ] Juu: oui
[skateinmars ] ici le prix ht est inchangeable, je me suis dit que j'allais varier :)
[Juu ] dans ce cas c'est plutot sur taux_tva qu'il faudrait le mettre, et le attr_accessor sur le prix_ht
[Juu ] ah, ok
[Blankoworld ] skateinmars: j'ai une classe insecte, je mets nombre_patte à 6. J'instancie une fourmi, je veux savoir le nombre de pattes
[Blankoworld ] pour chaque objet, je suis "théoriquement" en droit de connaître la variable de classe.
[skateinmars ] Blankoworld: nombre_patte étant une variable de classe ?
[skateinmars ] (tous les instectes ont 6 pattes ?)
[Juu ] Blankoworld : l'uml ça détruit les neurones :)
[Blankoworld ] oui puisque commune à l'ensemble des objets de la classe, non ?
[illovae ] skateinmars: oui
[Blankoworld ] Juu: spafo
[skateinmars ] Blankoworld: on va voir ca juste après :)
[Blankoworld ] (on apprend trop de théorie en classe j'ai l'impression :p)
[skateinmars ] on ba enchainer :)
[skateinmars ] *va
[skateinmars ] Ca serait quand même pas mal de pouvoir accéder à (ou modifier) une variable de classe depuis l'extérieur. On pourrait faire ceci :
[skateinmars ] def taux_tva
[skateinmars ] @@taux_tva
[skateinmars ] end
[skateinmars ] Comme on a fait tout à l'heure (avec éventuellement une méthode taux_tva=). Mais cela nous forcerait à créer un nouvel objet pour pouvoir utiliser cette méthode.
[skateinmars ] On va donc utiliser une méthode de classe :
[skateinmars ] class Produit
[skateinmars ] def self.taux_tva
[skateinmars ] end
[skateinmars ] Notez qu'ici `self` fera référence à la classe elle-même.
[skateinmars ] Une méthode de classe est utilisée directement comme ceci : `Produit.taux_tva`. Vous en connaissiez déjà une : la méthode `new` que l'on utilise pour créer un objet.
[skateinmars ] Vous remarquerez aussi qu'il n'y a pas d'équivalent à attr_accessor pour les variables de classe (elles ont une utilité moindre à être utilisées en dehors d'une classe que les variables d'instance).
[skateinmars ] questions ? ^^'
[Blankoworld ] Ok, donc pour accéder, on doit explicitement le dire à notre moule
[Blankoworld ] Notre moule à gâteau ;)
[skateinmars ] :)
[skateinmars ] Blankoworld: on va utiliser des constantes après ca a un peu plus de sens
[Blankoworld ] le nom doit être le même entre la méthode et la variable de classe ?
[skateinmars ] Blankoworld: non c'est juste une méthode
[Juu ] un peu la méthode coué
[skateinmars ] :))
[Blankoworld ] je tente avec un gâteau mais que nenni qu'il me dit
[illovae ] héhé
[skateinmars ] okay pour tout le monde alors ?
[illovae ] yep
[alpimarc ] oui
[Blankoworld ] oui on teste.
[skateinmars ] on va voir les constantes
[skateinmars ] Voici enfin un autre 'type' de variable après les variables d'instances et les variables de classe (sans oublier les variables "locales" classiques) : les constantes.
[skateinmars ] Reprenons notre cercle depuis le début :
[skateinmars ] class Cercle
[skateinmars ] PI = 3.14159
[skateinmars ] def initialize(rayon)
[skateinmars ] @rayon = rayon
[skateinmars ] end
[skateinmars ] def diametre
[skateinmars ] @rayon * 2
[skateinmars ] end
[skateinmars ] def aire
[skateinmars ] PI * (@rayon ** 2)
[skateinmars ] end
[skateinmars ] def circonference
[skateinmars ] diametre * PI
[skateinmars ] end
[skateinmars ] end
[skateinmars ] http://gist.github.com/raw/111737/2274c4045e6379d08557fe0562b8de3cc1da5e68/cercle.constantized.rb
[skateinmars ] Une variable constante commence par une majuscule et est écrite traditionnellement entièrement en majuscules.
[skateinmars ] Une constante doit être déclarée avant utilisation, et ne devrait pas être modifiée (un warning est généré si c'est le cas) bien que cela soit possible.
[skateinmars ] Notez que l'on peut accéder à une constante en dehors d'une classe comme ceci : `Cercle::PI`.
[skateinmars ] Blankoworld: donc pour tes insectes une constante sera plus utile :)
[petit ] possible de la "déclarer" en dehors d'une classe?
[petit ] et de l'tuiliser dans une methode?
[Juu ] il est possible d'y accéder depuis un objet instancié ?
[Blankoworld ] Insecte::NOMBRE_PATTES ?
[skateinmars ] Blankoworld: oui
[petit ] ('tain le cancer des doigts...)
[skateinmars ] Juu: euh, mon_cercle.class::PI ca compte ? ^^
[skateinmars ] petit: tu peut déclarer une constante à l'extérieur d'une classe oui
[Juu ] je suis généreux ce soir :D
[skateinmars ] elle sera utilisable dans toutes les classes
[skateinmars ] euh, des questions donc ? :)
[illovae ] no :)
[alpimarc ] c'est good
*Blankoworld vient de comprendre le truc des @@ :p
[Blankoworld ] Ouais c'est bon aussi.
[skateinmars ] Juu: il y a d'autres moyens mais pas direct genre mon_cercle::PI
[skateinmars ] Enfin remarquez que vous connaissez déjà plusieurs constantes : `Cercle` est par exemple une variable constante, comme le sont toutes les classes.
[skateinmars ] A ce propos sachez qu'un classe commence obligatoirement par une majuscule (car c'est une constante) et est par convention écrite en CamelCase.
[skateinmars ] Il y a bien d'autres choses à dire sur la programmation objet, mais voila déjà une grosse partie qui vous permettra d'apprécier la grand force de ruby : le fait que tout soit objet !
[skateinmars ] Comment ca, tout est objet ? On va voir tout de suite ce que cela implique.
[skateinmars ] ### Ruby, c'est la classe ###
[skateinmars ] (applaudissez)
[skateinmars ] Qu'entend-t-on par «Tout est objet en ruby» ?
[skateinmars ] Vous vous souvenez de la première leçon ou je vous ai montré plusieurs types de variables : nombres, strings...
[skateinmars ] Et bien tout ces types sont en fait des classes !
[skateinmars ] Regardez plutôt :
[skateinmars ] Array.new #=> []
[skateinmars ] (un tableau vide)
[skateinmars ] chaine = String.new('texte') #=> "texte"
[skateinmars ] (pas trop utile, mais c'est possible !)
[skateinmars ] chaine.length #=> 5
[skateinmars ] "bonjour".capitalize #=> "Bonjour"
[skateinmars ] Voila donc le secret. Nos types de variables sont simplement des classes, qui comportent de nombreuses méthodes.
[skateinmars ] okay ? :)
[Blankoworld ] la classe !
[Blankoworld ] 1.class
[skateinmars ] ca a l'air plus utile qu'un gateau d'un coup :]
[Blankoworld ] Ruby, connecting cakes
[Blankoworld ] On dit que Ruby a le pouvoir d'introspection, n'est il pas ? Quelle méthode permet de lister l'ensemble des méthodes d'une classe ?
[Blankoworld ] là j'ai tenté 1.class, ça sort Fixnum
[Juu ] y'a toujours une ficelle avec les String
[skateinmars ] Blankoworld: methods :)
[Blankoworld ] ok merci, je teste.
[illovae ] Blankoworld: Psychanalyse.methods
[alpimarc ] pratique la méthode .methods
[Blankoworld ] ah ouais, c'est comme Python finalement (un peu)
[illovae ] <:
[illovae ]
[Blankoworld ] illovae: U'r right
[skateinmars ] il y a aussi instance_methods, les méthodes utilisables sur les objets instanciés
[Blankoworld ] qu'est ce qui renseigne l'utilisation d'une méthode ou pas ? Cela veut dire que des méthodes ne sont pas utilisables si pas d'objets existants ?
[skateinmars ] Blankoworld: je crois que j'ai pas compris ta question la
[Blankoworld ] skateinmars: tu dis que instance_methods donne une liste de méthodes utilisables sur des objets instanciés.
[Blankoworld ] Ce qui pourrait insinuer que des méthodes ne sont pas utilisables.
[Blankoworld ] Donc existantes, mais pas utilisables en temps normal.
[skateinmars ] Blankoworld: les méthodes de classe
[Blankoworld ] Je me questionnais donc sur ce qui faisait cet état d'inutilisation
[Blankoworld ] ah je vois :p
[Blankoworld ] en effet, ça fait un "filtre" très utile.
[Blankoworld ] le methods est pour le développeur qui bidouille la classe elle même, le instance_methods pour le développeur qui utilise la classe.
[skateinmars ] (par contre instance_methods inclut les méthodes d'instance des classes parentes je crois)
[skateinmars ] enfin bref, amusons nous un peu avec les méthodes ! :)
[skateinmars ] Les possibilités quand à la manipulation de variables deviennent donc énormes en utilisant par exemple le chaînage de méthodes (le fait pouvoir exécuter plusieurs méthodes à la suite) :
[skateinmars ] "a f g b z y m".split.sort.join(' ') #=> "a b f g m y z"
[skateinmars ] Que se passe-t-il ici ? Reprenons pas à pas :
[skateinmars ] * On créé une variable appartenant à la classe String : "a f g b z y m"
[skateinmars ] * Sur cette variable, on utilise la méthode split, qui sert à découper une chaîne de caractères (par défaut selon les espaces) et renvoie un tableau qui sera ici égal à ["a", "f", "g", "b", "z", "y", "m"]
[skateinmars ] * Sur ce nouvel objet renvoyé, on utilise sort, qui range les éléments d'un tableau et renvoie le tableau rangé : ["a", "b", "f", "g", "m", "y", "z"]
[skateinmars ] * Enfin, on utilise join avec l'argument ' ' (une espace), qui va former un string à partir d'un tableau en séparant chaque élément par notre argument.
[skateinmars ] * On obtient donc notre chaîne finale "a b f g m y z" !
[skateinmars ] le chaînage de méthode est une technique souvent utilisée, vous voyez pourquoi :)
[ixzo ] ca évite de créer des variables "inutiles"
[ixzo ] ou du moins inutilement
[Blankoworld ] moins de ligne
[skateinmars ] oui, pas besoin de variables intermédiaires
[Blankoworld ] Au boulot, chez nous, ça servait à roxxer du kiki et se la péter.
[skateinmars ] Petit note également :
[skateinmars ] dans les docs, blogs, etc
[skateinmars ] vous verrez souvent la forme :
[skateinmars ] Class#methode
[skateinmars ] ca désigne simplement la méthode `methode` de la classe `Class`
[skateinmars ] des questions sur les classes ?
[illovae ] no pas qui viennent comme ça perso
[skateinmars ] ok donc on continue :)
[skateinmars ] Armé de ces connaissances, vous voilà donc prêts à profiter des énormes possibilités de ruby et ses classes.
[skateinmars ] Sachez qu'il y existe de nombreuses méthodes pour chacune des classes de base de ruby, n'hésitez donc pas à vous reporter à la documentation officielle :
[skateinmars ] http://ruby-doc.org/core/ (pour obtenir la documentation de la classe Array (tableaux), cliquez par exemple sur "Array" dans la liste des classes (liste du milieu)).
[skateinmars ] Variables globales
[skateinmars ] ------------------
[skateinmars ] Nous avons vu tout à l'heure qu'il existait plusieurs types (attention, pas dans le sens "type de donnée") de variables : variable d'instance, de classe, constantes.
[skateinmars ] Il existe un autre type de variable spécial, les variables globales. Celle-ci s'ecrivent `$nomdevariable` et on peut y accéder depuis n'importe quel endroit de notre programme.
[skateinmars ] Une variable globale n'est pas constante et la valeur d'une globale non déclarée est `nil`.
[skateinmars ] $blablanexistepas #=> nil donc
[skateinmars ] Quelques variables globales sont utilisées par ruby pour diverses fonctions, dont la variable `$KCODE` (égale à "NONE" par défaut). Cette variable permet de spécifier l'encodage avec lequel ruby travaille en interne.
[skateinmars ] Par exemple, avec : $KCODE = 'U'
[skateinmars ] Ou $KCODE = 'UTF8'
[skateinmars ] Ruby utilisera unicode. Ceci vous permet par exemple d'utiliser des variables dans les noms d'accents, et avec irb de voir les accents dans vos strings et non simplement leur code unicode.
[skateinmars ] Vous pouvez spécifier la valeur de $KCODE dans les options de ruby ou irb, avec pour unicode par exemple : `irb -Ku`.
[skateinmars ] notez que certains applications comme rails définissent $KCODE à 'UTF8'
[skateinmars ] *certaines
[illovae ] ça veut dire que tout n'est pas UTF8 ?
[skateinmars ] illovae: sans cette option non
[skateinmars ] par exemple sans $KCODE = 'UTF8'
[skateinmars ] texte = "héhé"
[skateinmars ] => "h\303\251h\303\251"
[illovae ] et ça peut donc changer d'une application à une autre, ou y'a quand même une variable globale définie quelque part ?
[skateinmars ] avec :
[skateinmars ] $KCODE = 'UTF8'"
[skateinmars ] on peut meme faire : >> ça = "ceci"
[illovae ] de toute façon les accents c'est pas une bonne idée, même si on défini le $KCODE et que le code .rb se retrouve sur une machine où y' apas d'ut8...
[skateinmars ] illovae: oui en effet
[Blankoworld ] utilisée pour Rails, parce que le Matz a fait un schmilblick en Jap
[Blankoworld ] :)
[skateinmars ] on continue :)
[illovae ] yep
[skateinmars ] Attention toutefois lors de l'utilisation des variables globales !
[skateinmars ] En effet elles peuvent être accédées, et modifiées, depuis n'importe quel endroit du programme. Ceci peut donc entraîner des comportements bizarres si vous utilisez par exemple la même globale dans plusieurs classes.
[skateinmars ] L'utilisation des globales est donc fortement déconseillée, même si elle est parfois nécessaire.
[skateinmars ] ### La portée des variables ###
[skateinmars ] Je profite de cette section sur les variables globales pour parler un instant de la portée des variables.
[skateinmars ] Cette notion de "portée" désigne l'étendue de code dans lequel nos variables peuvent être utilisées.
[skateinmars ] Regardons cet exemple :
[skateinmars ] class Personne
[skateinmars ] end
[skateinmars ] end
[skateinmars ] moi = Personne.new
[skateinmars ] moi.nom = "Doe"
[skateinmars ] moi.prenom = "John"
[skateinmars ] puts moi.nom_complet
[skateinmars ] puts le_nom_complet
[skateinmars ] La dernière instruction provoquera une erreur.
[skateinmars ] http://gist.github.com/raw/111737/b15341420d8db8eda021dbe20f63a3f0d84dccaa/portee.rb
[skateinmars ] En effet la variable le_nom_complet est définie dans la méthode nom_complet uniquement, on ne pourra pas y accéder depuis un autre endroit car sa portée est limitée à la méthode.
[skateinmars ] De même, on ne pourra pas accéder à la variable `moi` depuis notre classe.
[skateinmars ] Notez également que les constantes qui ne sont pas contenues dans une classe peuvent être utilisées depuis n'importe quel endroit (on dit qu'elles ont une "portée globale").
[skateinmars ] Les constantes déclarées dans une classe peuvent être accédées depuis n'importe quel endroit de cette classe (comme la constante PI de tout à l'heure).
[skateinmars ] Ce principe de portée ("scope" en anglais) est important à connaître et respecter pour écrire des classes (et des programmes) qui travaillent en harmonie entres eux.
[skateinmars ] rien de neuf pour les experts que vous êtes je pense :)
[illovae ] genre :>
*illovae parle pour lui bien sûr
[skateinmars ] :)
[petit ] mmm..
[skateinmars ] des questions ? :)
[alpimarc ] nop, c'est bon
[skateinmars ] petit: ?
[skateinmars ] ca m'a l'air bon :)
[petit ] nan je répondais à la remarque: rien de neuf pour les experts que vous êtes je pense :)
[skateinmars ] héhé
[skateinmars ] Conclusion
[skateinmars ] ----------
[skateinmars ] (déjà !)
[skateinmars ] j'avais pas vu l'heure en fait
[illovae ] ^^
[skateinmars ] un dilemne se pose... on arrête ou on continue, sachant que j'ai pas fini d'écrire la suite ? :]
[skateinmars ] (eventuellement il reste 2 points importants que je peut aborder)
[illovae ] stoi le prof, prof comme tu veux
[skateinmars ] ils en pensent quoi les gens ?
[skateinmars ] (niveau temps)
[Coolgeek ] skateinmars = Prof.new () ; skateinmars.stop ;
[Coolgeek ] :p
[alpimarc ] +1
[skateinmars ] bon ok on termine :}
[illovae ] (:
[Coolgeek ] (je vais dodoter la en fait :p)
[skateinmars ] Notre session se termine donc, alors qu'il reste tant de choses à découvrir !
[skateinmars ] Nous en avons appris beaucoup aujourd'hui sur des concepts très importants, et somme presque prêts à écrire un programme complet à la sauce ruby, mais il manque encore quelques éléments du langages pour pouvoir réaliser nos rêves les plus fous.
[petit ] (yen a d'autres de prévu?)
[skateinmars ] Notre série de cours d'initiation n'est donc pas terminée et j'espère vous revoir bientôt pour la partie numéro 3 !
[alpimarc ] ce n'est que partie remise
[illovae ] \o/
[skateinmars ] donc oui il y en aura d'autres
[petit ] Cool!
[skateinmars ] c'etait un peu trop théorique ici
[illovae ] stay tuned to http://u-classroom.net pour avoir des infos ;)
[skateinmars ] mais après la partie 3 on pourra lancer des sessions comme ruby on rails par exemple
[skateinmars ] avec des exemples et de la pratique
[ixzo ] yeah!
[alpimarc ] cool
[cazutage ] :}
[Blankoworld ] Et pirater pleins de sites webs en les attaquant :p
[ixzo ] vite la prochaine alors! :p
[skateinmars ] :)
[Blankoworld ] Ruby, c'est sexy, ma femme s'appelera comme ça.
[illovae ] ce'st un peu long à dire "hey Ruby cay sexy tu me passe le sel ?"
[Blankoworld ] Merci skateinmars pour la session ;), prochaine session sur les session alors ? Introspection on appelle ça non ?
[illovae ] coupe les logs skateinmars avnt qu'on parte en sucette :>
[piti ] (!logstop)
[skateinmars ] héhé