




tenderly written and illustrated by


Licensed under the Attribution-ShareAlike license.
See http://creativecommons.org/licenses/by-sa/2.0/ for details.
![[o]](i/chapter.poignant.guide-1.jpg)




![[o]](i/chapter.poignant.guide-2.jpg)
Supposons que vous ayez ouvert ce livre (bien que vous ayez probablement ouvert ce livre), et que vous trouviez un énorme oignon juste au milieu. (L’imprimeur du livre a inclus l’oignon à ma demande.)
Donc, vous pensez, “Whoua, ce livre est livré avec un oignon !” (Même si vous n’aimez pas particulièrement les oignons, je suis sûr que vous êtes à même d’apprécier la logistique nécessaire à la livraison discrète de quelque produit que ce soit à l’intérieur d’un prétendu manuel de programmation.)
Puis vous vous demandez, “Attend une minute. Je pensais que c’était un livre sur Ruby, l’incroyable nouveau langage de programmation en provenance du Japon. Et, bien que j’apprécie la logistique nécessaire à la livraison discrète de quelque produit que ce soit à l’intérieur d’un prétendu manuel de programmation, Pourquoi un oignon ? Que suis-je supposé faire avec ?”
Non. S’il vous plait, ne vous posez pas de question. Vous ne devez rien faire avec cet oignon. Mettez l’oignon de côté et laissez le faire quelque chose pour vous.
Je serais direct avec vous. Je veux vous faire pleurer. Sangloter, larmoyer gentillement. Ce livre est un guide poignant vers Ruby. Ce qui veut dire un code si beau qu’il vous en tirera des larmes. Cela veut dire des contes galants et de sombres vérités qui feront que vous vous réveillerez le matin suivant dans les bras de ce livre. Le serrant étroitement contre vous toute la journée. Si nécessaire, fabriquez un étui pour le Guide (Poignant) de Why vers Ruby, afin de l’avoir toujours contre vous.
Vous devriez vraiment sangloter une fois. Ou au moins renifler. Et sinon, l’oignon vous aidera.
OK, essayons ce premier morceau d’intensité:
Un jour, alors que je marchais sur une de ces routes à grand trafic pleines de vendeurs de voitures (c’était peu après l’annulation de mon mariage), j’ai trouvé un chien abandonné sur la route. Un chien laineux, noir avec des yeux rouges verdâtres. Me sentant moi-même un peu abandonné, j’attrapais quelques ballons accrochés à un poteau devant une agence, et je les accrochais au collier du chien. Ensuite j’ai décidé qu’il serait mon chien. Je l’appelai Bigelow.
Nous sommes partis chercher des croquettes pour Bigelow, puis pour aller chez moi, ou nous pourrions nous asseoir dans des fauteuils et écouter du Gorky’s Zygotic Mynci. Oh, et nous devions aussi nous arrêter afin d’acheter à Bigelow son propre fauteuil.
Mais Bigelow ne m’avait pas accepté pour maître. Aussi au bout de cinq minutes, ce chien stupide a choisi une autre route à un croisement et je ne l’ai plus jamais revu. Ainsi, tandis qu’il n’avait précédemment été perdu qu’une seule fois, il l’était maintenant deux fois. J’ai alors ralenti le pas qui me menait vers une vie faite de croquette et de fauteuils supplémentaires. J’ai eu un chien pendant cinq minutes.
Quel chien stupide. Je m’assis sur un banc et jetais des pommes de pin sur la statue de trois chèvres traversant un pont. Après cela, j’ai pleuré pendant des heures. Les larmes coulaient toutes seules. Voilà quelque chose de poignant.
Je me demande où il est allé avec tous ces ballons. Ce chien fou ressemblait à une fête sur pattes.
Ce n’est que peu de temps après que j’ai joué mon propre Bigelow. J’avais imprimé un ensemble de pages sur Ruby. des articles trouvés sur le Net. Je les ai parcouru lors de mon trajet de retour, en train, un soir. J’ai joué avec pendant cinq minutes avant d’abandonner. Pas impressionné.
Je m’assis, contemplant le monde depuis la fenêtre, un mixer géant mélangeant les graffitis et l’acier fondant devant moi. Ce monde est trop grand pour un si petit langage, pensais-je. Cette pauvre petite chose n’a aucune chance. Même pas de jambe pour tenir debout. Même pas de bras pour nager.
Et pourtant, j’étais là. Un petit homme sur un petit train fragile (et j’avais même encore une dent de lait à cette époque) parmi des milliards de personnes sur une pierre bleue flottante. Comment pourrais je dénigrer Ruby? Qui peut dire si je ne vais pas m’étouffer avec mon téléphone portable et mourir plus tard dans la soirée. Why mort, Ruby continuera à vivre.
La pierre tombale:
Qu’y a-t-il dans sa trachée? Oh, regarde, un Nokia!
Quelle chance. Finalement réussir à avoir un bon et long somme sous terre, juste pour être constamment dérangé par le Canon de Pachelbel sortant de mon estomac.
Donc, maintenant, vous vous demandez pourquoi j’ai changé d’avis quant à Ruby. La réponse rapide est: on s’est tapé dans l’oeil.
Comme lorsque vous rencontrez Quelqu’un au lycée, et qu’il ressemble à Quelqu’un qui avait l’habitude de vous peinturlurer le visage quand vous êtiez enfant. Impulsivement, vous aviez conclus que ce Quelqu’un n’était pas un ami. Vous critiquiez sa coiffure. Vous décrochiez bruyamment le téléphone aux moments cruciaux des histoires qu’il racontait. Vous utilisiez votre baton sauteur juste là où il essayait de marcher!
Toutefois, six mois plus tard, vous et Quelqu’un bavardiez tranquillement à côté d’une fontaine. Il ne ressemblait plus à votre cauchemard d’enfance. Vous aviez trouvé le Bon Jumeau. Le coup de foudre.
Aussi, là où je devrais sans doute vous assomer d’exagérations à propos de Ruby, ainsi qu’avec le lot d’acronymes pertinents qui l’accompagne partout (soulevant les sifflements collectifs de votre patron et du patron de votre patron), je vous laisserai juste faire une promenade. Je vous laisserai tomber dans du code, intervenant parfois avec mes propres expériences. Ce sera très simple, très naturel.
Je devrais toutefois vous offrir quelque motivation. Aussi, Smotchkkiss, je vais vous donner mes trois meilleures raisons d’apprendre Ruby.
Vitamine R. Monte directememnt au cerveau. Ruby vous apprendra à exprimer vos idées grâce à l’ordinateur. Vous écrirez des histoires pour une machine.
Le talent créatif, les gars. Déduction. Raison. Signe de tête intelligent. Ce langage deviendra pour vous un outil vous permettant de connecter votre esprit au monde. J’ai remarqué que beaucoup d’utilisateur expérimentés de Ruby semble avoir les idées claires et être objectifs. (A contrario de fortement partial et brut).
Ruby est né au Japon. Ce qui est original. Le Japon n’est pas connu pour ses logiciels. Et puisque les langages de programmation sont principalement écrit en Anglais, qui suspecterait un langage de venir du Japon?
Et pourtant, nous avons Ruby. Contre tout attente, Yukihiro Matsumoto a créé Ruby le 24 Février 1993. Durant les dix dernières années, il a progressivement amené Ruby à une plus large audience. C’est noble, triomphant et tout ça. Supportez la diversité. Aidez nous à incliner la Terre juste un peu.
Utiliser Ruby ne coûte rien. Le code de Ruby lui-même est ouvert à tous. Aussi, ce livre est libre. Tout cela fait partie d’un grand et gros don qui devrait avoir un gros accroc.
Vous pensiez que nous allons vous faire acheter des aspirateurs, du temps-partagé ou de faux Monets. Vous pensiez qu’il y aurait une présentation de 90 minutes, à la fin de laquelle le propriètaire de la compagnie viendrait vous taper dans le dos pour conclure le marché.
Non, libre.
Maintenant, il est temps de commencer ce livre. Vous pouvez donc sortir votre surligneur et commencer à le promener sur chacun des mots captivants de cette phrase. Je pense que j’ai assez de laque et de fausse monnaie sur moi pour me sustenter jusqu’à la dernière page.
Bien, si vous avez jamais lu un livre, vous savez qu’aucun livre ne commence sans une parfaite synergie. Oui, synergie. Peut-être ne le saviez-vous pas. La synergie signifie que vous et moi sommes supposés coopérer afin de faire de la lecture de ce livre une expérience à part entière.
Nous allons commencer ce livre par bien nous entendre lors de l’Introduction. Cette unité, cette synergie nous propulsera tout au long du livre, avec moi pour guide. Vous me donnerez un rassurant hochement de tête ou un rire pour m’indiquer votre progression.
Je suis Peter Pan tenant votre main. Allez, viens Wendy! Deuxième étoile sur la droite puis tout droit jusqu’au matin.
Un seul problème ici. Je ne m’entends pas bien avec les personnes. Je ne tiens pas bien les mains.
N’importe qui dans mon équipe vous le dira. Aux Cérémonies d’Ouverture de Ce Livre (un évennement approvisioné sur des sièges de stade), j’ai découvert que les sandwiches au concombre n’était pas servi avec des essuie-mains. Du coup le beurre ne tenait pas bien avec les concombres… De toute façon, j’ai fait un bon show et mis le feu a plusieurs des camions publicitaires à l’entrée. J’ai éclaté des projecteurs et tout ça. J’ai eu ce fort rire de maniaque dans la nuit. C’était vraiment la pagaille.
Mais comme je ne m’entends pas très bien avec les personnes, je n’avais invité personne à part moi au Cérémonies d’Ouverture de Ce Livre. Donc ce n’était pas vraiment embarassant. Je l’ai gardé secret et personne n’a encore découvert cela.
Aussi, vous devez savoir que synergies ne veut pas exactement dire synergie dans ce livre. Je ne peux pas être en synergie normale. Non, dans ce livre, synergie veut dire des renards de bande-dessinée. Ce que je veux dire c’est que ce livre va commencer par un grand nombre de renards de bande-dessinée.
Et je compte sur vous pour les transformer en synergie.
![[o]](i/chapter.poignant.guide-3.jpg)

Yeah, ils sont deux. Mon asthme revient, aussi dois-je prendre une bouffée de médicament maintenant. Je reviens dans deux minutes.

On m’a dit qu’il vallait mieux être équipé d’un mouchoir pour ce chapitre. Quelque chose pour vous éponger le visage lorsque vous allez suer.
En effet, nous allons faire un tour à travers le langage en entier. Comme allumer chaque allumette d’une boite, aussi vite que possible.

Ma conscience ne me laisserais pas appeler Ruby un langage pour ordinateur. Cela impliquerait que le langage utilise principalement des termes de l’ordinateur. Que le langage est fait pour aider l’ordinateur en premier lieu. Et que donc, nous, les développeurs sommes des étrangers, cherchant à nous acclimater à l’ordinateur. C’est le langage de l’ordinateur et nous sommes les traducteurs pour le monde.
Mais comment appelez-vous un langage, quand votre cerveau commence à penser dans ce langage? Quand vous commencez à utiliser les propres mots du langage pour vous exprimer. Une machine ne peut faire ça. Comment cela pourrait-il être le langage de la machine? C’est le notre, nous le parlons naturellement!
Nous ne pouvons donc décemment pas l’appeler un langage pour ordinateur. C’est un dialecte de développeur. C’est le langage de nos pensées.
Lisez ce qui suit à haute voix, pour vous-même.
5.times { print "Odelay!" }
Dans les phrases françaises, les signes de ponctuation (telle que le point, le point d’exclamation, les parenthèses) sont des silences. La ponctuation ajoute du sens aux mots, en donnat des informations sur ce que l’auteur de lap hrase veut exprimer. Aussi lisons ce qui précède comme: Cinq fois affiche “Odelay!”.
Ce qui est exactement ce que fait ce petit programme en Ruby. L’exclamation en Espagnol mutant de Beck s’affichera cinq fois à l’écran.
Lisez ce qui suit à haute voix, pour vous-même.
exit unless "restaurant".include? "aura"
Ici nous faisons un test réel basique. Notre program sortira (exit: le programmera s’arrètera) à moins que (unless) le mot restaurant ne contienne (includes) le mot aura. Encore une fois, en Français: Arrête à moins que le mot restaurant n’inclue le mot aura.
Avez-vous déjà vu un langage de programmation utiliser les points d’interrogation de façon si effective? Ruby utilise certains signes de ponctuation, comme les points d’exclamation ou d’interrogation, pour augmenter la lisibilité du code. Dans le code précédent nous posons une question, aussi pourquoi ne pas rendre cela explicite?
Lisez ce qui suit à haute voix, pour vous-même.
['pain', 'fromage', 'vin'].each { |food| print food.capitalize }
Bien que ce bout de code soit moins lisible et moins semblable à une phrase que le précédent, je vous encourage quand même à le lire à haute voix. Même si Ruby peut se lire parfois comme de l’Anglais, il se lit aussi parfois comme un Anglais plus concis. En traduisant complètement ce qui précède en Anglais, vous auriez: With the words ‘pain’, ‘fromage’, and ‘vin’: take each food and print it capitalized. (NDT: En Français: Avec les mots ‘pain’, ‘fromage’ et ‘vin’: prendre chaque nourriture et l’afficher avec la première lettre en majuscule.)
L’ordinateur repondra alors courtoisement: Pain, Fromage et Vin.
Maintenant, vous devez vous demander comment ces mots vont en fait ensembles. Smotchkkiss se demande ce que signifient les points et les crochets. Je vais maintenant traiter les différents constituants du discours.
Tout ce que vous avez besoin de savoir est que Ruby est, à la base, fait de phrases. Ce ne sont pas exactement des phrases anglaises. Ce sont des ensembles de mots et de signes de ponctuation qui entourent une idée simple. Ces phrases peuvent former des livres. Elles peuvent former des pages. elles peuvent former des nouvelles entières, en les assemblant. Ces nouvelles peuvent être lues par des humains, mais aussi par des ordinateurs.
Comme la raie blanche en bas du dos de la mouffette et l’enroulement blanc du cortège de la mariée, plusieurs des constituants du discours de Ruby ont des indices visuels afin de vous aider à les identifier. La ponctuation et la capitalisation aideront votre cerveau à voir des parties de code et à ressentir une intense identification. Votre esprit vous criera fréquemment Hé, je connais ça mec! Vous serez aussi capable de placer ces noms dans les conversations avec d’autres Rubyistes.
Essayez de vous focaliser sur l’apparence de chacuns de ces constituants. Le reste du livre detaillera chaque spécificité. Je donne une description courte pour chacun des constituants, mais vous n’avez pas à comprendre l’explication. A la fin de ce chapitre, vous devriez pouvoir reconnaître chaque partie d’un programme écrit en Ruby.
N’importe quel mots constitué de lettres minuscules est une variable en Ruby. Les variables peuvent être constituées de lettres, chiffres ou de soulignés (NDT: _).
x,y,banane2outelephoner_a_une_caillesont des exemples.
Les variables sont comme des surnoms. Vous vous rappelez quand tout le monde vous appelait Pierre-Qui-Pue? Les gens disait, “Viens ici Pierre-Qui-Pue!” et tout le monde savait miraculeusement que vous étiez Pierre-Qui-Pue.
Les variables vous permettent de donner un surnom à ce que vous utilisez fréquemment. Par exemple, supposons que vous dirigiez un orphelinat. C’est un orphelinat moyen. Et quand Papa Warbucks vient pour acheter plus d’enfants, on insiste pour qu’il paie cent vingt et un euros et huit centimes pour l’ourson en peluche de l’enfant, auquel il s’est attaché dans les moments sombres de sa vie de cauchemard.
frais_d_ourson = 121.08
Plus tard, quand vous le retrouverez à la caisse enregistreuse (une caisse enregistreuse de première puisqu’elle tourne sous Ruby), vous devrez additioner ensemble toutes ces factures pour obtenir le total.
total = frais_d_orphelin + frais_d_ourson + gratuite
Ces noms de variables aident vraiment. Et dans le milieu miteux de la vente d’enfants, je suis sûr que toute aide est appréciée.

Le type le plus basique de nombre est l’entier (integer), une série de chiffres qui peut commencer avec un signe plus ou moins.
1,23, et-10000en sont des exemples.
Les virgules ne sont pas autorisées dans les nombres, mais les soulignés (NDT: _) le sont. Donc, si vous sentez la nécessité de marquer les milliers afin que vos nombres soient plus lisibles, utilisez un souligné.
population = 12_000_000_000
Les nombres décimaux sont appelés flottants (floats) en Ruby. Les flottants sont faits de nombres avec une partie décimale ou une notation scientifique.
3.14,-808.08et12.043e-04en sont des exemples.
Les chaines de caractères sont composées de n’importe quel caractère (lettre, chiffre, signe de ponctuation) entourés par des guillemets. A la fois les guillemets simples et doubles sont utilisés pour créer des chaines de caractères.
"laboratoire",'2021'ou"Ces bande-dessinées sont hilarantes!"en sont des exemples.
Quand vous entourez des caractères par des guillemets, ils sont stoqués ensemble, comme une seule chaine.
Pensez à un journaliste qui transcrit les divagations d’une célébrité. “Je suis beaucoup plus raisonnable,” dit Avril Lavigne. “Maintenant, je sais à quoi ressemble le mileu—ce que vous devez faire et comment le faire.”
avril_citation = "Je suis beaucoup plus
raisonnable. Maintenant, je sais à quoi ressemble
le mileu -- ce que vous devez faire et comment le
faire."De même que nous venions de stoquer un nombre dans la variable frais_d_ourson, nous stoquons maintenant une suite de caractères (une chaine) dans la variable avril_citation. Le journaliste envoie cette citation à l’impression, qui par chance, utilise Ruby pour faire fonctionner sa presse.
print oprah_citation
print avril_citation
print ashlee_simpson_debacle
Les symboles sont des mots qui ressemblent à des variables. Encore une fois, ils peuvent contenir des lettres, des chiffres ou des soulignés. Mais ils commencent avec deux points.
:a,:b, ou:ponce_de_leonen sont des exemples.
Les symboles sont des chaines de caratères “légères”. Généralement les symboles sont utilisés dans les situations ou vous avez besoin d’une chaine de caractères mais où vous ne voulez pas l’afficher à l’écran.
Vous pouvez voir les symboles comme étant plus léger pour l’ordinateur. Ils sont comme un antiacide. Les deux points ressemblent aux bulles remontant de l’estomac de l’ordinateur alors qu’il digère le symbole. Ah, quel soulagement!

Les constantes sont des mots, à l’instar des variables, mais elles commencent par une lettre majuscule. Si les variables sont les noms de Ruby, alors pensez les constantes comme étant les noms propres.
Time,ArrayouBunny_Lake_a_Disparuen sont des exemples.
En Anglais (NDT: et en Français), les noms propres commencent par une majuscule. L’Empire State Building. Vous ne pouvez pas changer l’Empire State Building. Vous ne pouvez pas décider que l’Empire State Building désignera quelque chose d’autre. Les noms propres sont comme celà. Ils se rapportent à quelque chose de très spécifique et généralement ne changent pas au cours du temps.
De la même façon, les constantes ne peuvent pas changer après avoir été assignées.
EmpireStateBuilding = "350 5th Avenue, NYC, NY"
Si nous essayons de changer la constante, Ruby se plaindra. On désaprouve de telles pratiques.

Si les variables et les constantes sont les noms, alors les méthodes sont les verbes. Les méthodes sont généralement rattachées à la fin des variables par un point. Vous avez déjà vu des méthodes:
porte_devant.ouvre
Dans l’exemple précédent, ouvre est la méthode. C’est l’action, le verbe. Dans certains cas vous pouvez voir des actions enchainées.
porte_devant.ouvre.ferme
Nous avons demandé à l’ordinateur d’ouvrir la porte de devant et de la fermer immédiatement.
porte_devant.est_ouverte?
Ce qui précède est aussi une action. Nous demandons à l’ordinateur de tester la porte afin de savoir si elle est ouverte. On aurait pu appeler la méthode Porte.essaie_de_savoir_si_elle_est_ouverte mais le nom est_ouverte? est plus succint et tout aussi correct. On peut utiliser à la fois les points d’exclamation et d’interrogation dans les noms de méthodes.
Une méthode peut avoir besoin de plus d’information pour effectuer son action. Si nous voulons demander à l’ordinateur de peindre la porte, nous devons lui en indiquer la couleur.
Les arguments des methodes sont attachés à la fin des méthodes. Ils sont générallement entourés par des parenthèses et séparés par des virgules.
porte_devant.peindre( 3, :rouge )
Ce qui précède peint de 3 couches rouges la porte.
Représentez le vous comme une chambre à air que la méthode traine avec elle. Les parentèses forment les bords ronds et humides de la chambre à air. Les virgules sont les pieds de chaque argument accrochés au bord. Le dernier argument a ses pieds sous lui de façon à les cacher.
A l’instar d’un bateau pouvant remorquer plusieurs chambres à air, on peut enchainer les méthodes avec arguments.
porte_devant.peindre( 3, :rouge ).seche( 30 ).ferme()
Ce qui pécède peint de 3 couche de rouge la porte, la sèche pendant 30 minutes et la referme. Même si la dernière méthode n’a pas d’argument vous pouvez quand même mettre des parenthèses si celà vous chante. Toutefois, il est inutile de trainer une chambre à air vide, donc on ommet généralement les parenthèses.
Certaines méthode (comme print) sont des méthode de base (NDT: des méthodes du Kernel de Ruby). Ces méthodes sont utilisées partout en Ruby. Comme elles sont très fréquentes, on n’utilise pas le point.
print "Voyez, aucun point."
Comme les méthodes dont on vient de parler (que l’on appelle aussi des méthode d’instance (NDT: en anglais, instance methods)), les méthodes de classe sont généralement attachées aux variables et aux constantes. Plutôt qu’un point, on utilise deux double points pour les séparer.
Door::new( :oak )
Comme on peut le voir, la méthode de classe new est généralement utilisée pour créer de nouvelles choses. Dans l’exemple précédent, on demande à Ruby de nous créer une nouvelle porte en chêne. Bien sûr, Ruby doit savoir comment fabriquer une porte—de même que du bois de charpente, des bucherons et ces longues scies à deux hommes.

Les variables commençant par un signe dollar sont globales.
$x,$1,$chunkyet$CHunKY_bACOnen sont des exemples.
La plupart des variables sont par nature temporaires. Certaines parties de votre programme sont comme de petites maisons. Vous y entrez et elles ont leurs propres variables. Dans une maison, vous pouvez avoir papa qui représente Archie, le représentant de commerce et collectionneur de squelette. Dans une autre maison, papa peut représenter Pierre, un dompteur de lion ayant un penchant pour la flanelle. Chaque maison a sa propre signification pour papa.
Avec les variables globales, vous avez la garantie que la variable sera la même dans chaque petite maison. Le signe dollar est tout à fait approprié à cela. Chaque foyer américain respecte la valeur du dollar. Nous en sommes dingues. Essayez de frapper à la porte de n’importe quelle maison américaine et tendez leur du fric. Je peux vous garantir que vous n’obtiendrez pas le même effet si vous frappez à une porte et leur offrez Pierre, le dompteur de lion ayant un penchant pour la flanelle.
Les variables globales peuvent être utilisées n’importe où dans votre programme. Elles ne sont jamais perdues de vue.
Les variables commençant par une arobase sont des variables d’instance.
@x,@y, et@only_the_chunkiest_cut_of_bacon_I_have_ever_seenen sont des exemples.
Ces variables sont généralement utilisées pour définir les attributs de quelque chose. Par exemple vous pouvez fournir à Ruby la largeur de la porte_devant en affectant une valeur à la variable @largeur dans cette porte_devant. En Ruby, les variables d’instance sont utilisées pour définir les caractèristiques d’un objet donné.
Pensez au symbole arobas comme signifiant attribut. (NDT: marche mieux en anglais, où l’arobas se nomme at).
Les variables commençant par une double arobase sont des variables de classe.
@@x,@@y, et@@i_will_take_your_chunky_bacon_and_raise_you_twoen sont des exemples.
Les variables de classe sont aussi utilisées pour définir des attributs. Mais plutôt que de définir un attribut pour un seul objet en Ruby, les variables de classe définissent un attribut pour plusieurs objets apparentés. Si les variables d’instance définissent les attributs pour une seule porte_devant, alors les variables de classe définissent les attributs pour tout ce qui est une Porte.
Pensez au double arobas comment signifiant attributs pour tous . Ou vous pouvez vous les imaginer comme un essaim de chasseurs AT-AT de Star Wars, tous commandés par Ruby (NDT: marche bien mieux en anglais ou l’arobase se nomme at). Vous modifiez une variable de classe et tous changent, pas seulement un.

Tout code entourré par des accolades est un bloc.
2.times { print "Oui, j'ai utilisé Chunky Bacon dans mes exemple, mais je ne le ferai plus!" }en est un exemple.
Avec les blocs, vous pouvez grouper un ensemble d’instruction de façon à les transmettre au cours de votre programme. Les accolades ressemblents à des pinces de crabe qui auraient aggripé le code et le tiendrait groupé. Quand vous voyez ces deux pinces, rappelez vous que le code enserré a été compressé en une seule unité.
C’est comme l’une des ces petites boites Hello Kitty qu’ils vendent au supermaché, remplies de petits stylos et de papier microscopique, le tout empaqueté dans une petite trousse transparente et brillante qui tient dans le creux de la main. Mis à part que les blocs évitent de trop loucher.
Les accolades peuvent aussi être remplacées par les mots do et end, ce qui est plus clair si votre bloc tient sur plusieurs lignes.
loop do
print "Beaucoup mieux."
print "Ah. Plus d'espace!"
print "J'avais mal au dos à cause de ces pinces de crabe."
endLes arguments de bloc sont un ensemble de variables entourées par des pipes (NDT: |) et séparées par des virgules.
|x|,|x,y|, et|up, down, all_around|en sont des exemples.
Les arguments de bloc sont utilisés au début d’un bloc.
{ |x,y| x + y }
Dans l’exemple précédent, |x,y| sont les arguments. Le code se trouve après les arguments. L’expression x + y ajoute les deux arguments ensembles.
J’aime me représenter les deux caractères pipe comme un tunnel. Ils donnent l’impression d’un toboggan sur lequel les variables glissent. (x descend en écartant les jambes, alors que y croise les jambes.) Ce toboggan joue le rôle d’un passage entre les blocs et le monde qui les entoure.
Les variables sont passées grâce à ce toboggan (ou tunnel) au bloc.

Un intervalle est composé de deux valeurs entourées par des parenthèses et séparées par une ellipse (sous la forme de deux ou trois points).
(1..3)est un intervalle, comprenant les nombres 1 à 3.
('a'..'z')est un intervalle comprenant les lettres minuscules.
Voyez-le comme un accordéon qui a été plié afin d’être transporté. (Bien sûr, le fait de vous promener avec un accordéon déplié peut vous apporter une grande vanité, mais parfois une personne a besoin de se vautrer dans le doute, en le transportant, plié, dans son étui.) Les parenthèses représentent les poignées sur les côté d’un bandoléon. Les points représentent la chaine qui maintient l’accordéon plié.
Généralement, on utilise seulement deux points. Si un troisième point est utilisé, la dernière valeur de l’intervalle est exclue.
(0...5)représente les nombres de 0 à 4 inclus.
Quand vous voyez ce troisième point, imaginez que vous ouvrez légèrement l’accordéon. A peine assez pour laisser s’échapper une seule note. La note est la valeur de fin. Laissons-là monter vers le ciel.
Un tableau est une liste entourée par des crochets et dont les éléments sont séparés par des virgules.
[1, 2, 3]est un tableau de nombres.
['coat', 'mittens', 'snowboard']est un tableau de chaine de caractères.
Représentez le vous comme une chenille qui aurait été aggrafée sur votre code. Les deux crochets sont les aggrafes qui l’empèche de bouger, afin de noter où se trouvent la tête et la queue. Les virgules sont les jambes de la chenille frétillantes entre chaque section de son corps.
Il était une fois une chenille qui avait des virgules à la place des jambes. Ce qui veut dire qu’elle devait faire une pause littéraire après chaque pas. Les autres chenilles la respectaient beaucoup pour cette particularité, et elle servait un peu de chef. Et sans parler d’un philanthrope! Il était connu pour donner des feuilles fraiches aux moins fortunées.
Oui, un tableau est une collection de choses, mais il garde aussi ces choses dans un ordre spécifique.
Une table de hachage est un dictionnaire entouré par des accolades. Les dictionnaires font correspondre des noms à leur définition. Ruby indique celà par une flêche, faite d’un signal egal suivit par un signe supérieur.
{'a' => 'aardvark', 'b' => 'badger'}en est un exemple.
Cette fois, les accolades représentent de petits symboles en forme de livre. Regardez comme elles ressemblent à de petits livres ouvert, pliés en leur milieu. Ils représentent l’ouverture et la fermeture de notre dictionnaire.
Imaginez que notre dictionnaire ait une définition sur chaque page. Les virgules représentent les coins de chacune des pages, que nous tournons pour voir la prochaine définition. Et sur chaque page: un mot suivi par une flêche poitant vers sa définition.
{
'nom' => 'Pierre',
'profession' => 'dresseur de lion',
'grand amour' => 'flannelle'
}Je ne compare pas les tables de hachage aux dictionnaires pour indiquer que l’on ne peut stocker que des définitions dans les tables de hachage. Dans l’exemple précédent, j’ai stocké les informations personnelles de Pierre, le dresseur de lion avec un penchant pour la flannelle. Les tables de hachage sont comme les dictionnaires car elles permettent une recherche facile.
A la différence des tableaux, les éléments d’une table de hachage ne sont pas gardés selon un ordre spécifique.

Un expression régulière(ou regexp) est un ensemble de caractères entourés par des slashes.
/ruby/,/[0-9]+/et/^\d{3}-\d{3}-\d{4}/en sont des exemples.
Les expressions régulières sont utilisées pour trouver des mots ou des motifs dans du texte. Les slahes de chaque côté de l’expressions sont des épingles.
Imaginez que vous ayez un petit mot avec des épingles de chaque côté et que vous le passiez sur le livre. Vous promenez le mot sur le texte et quand il s’approche d’un mot correspondant, il commence à clignoter. Vous épinglez alors l’expression régulière sur le livre, juste sur le mot correspondant et il fait briller les lettres du mot.
Et quand vous plantez les épingles dans le livre, le papier éternue, ”reg-exp!”.
Les expressions régulières sont beaucoup plus rapide que de passer vos mains sur les pages du livres. Ruby peut utliser une expression régulière pour chercher à travers énormément de livres très rapidement.
Vous utiliserez la liste suivantes d’opérateurs pour faires des maths en Ruby ou pour comparer des choses. Lisez la liste, essayez d’en reconnaître certains. Vous savez, l’addition +, la soustraction - et tout celà...
** ! ~ * / % + - & << >> | ^ > >= < <= <=> || != =~ !~ && += -= == === .. ... not and or
Ruby comporte un certain nombre de mots-clé, imprégnés de signification. Ces mots ne peuvent être utilisés comme nom de variable ou modifiés afin de s’accorder à vos désirs. Nous avons déjà parlé de certains d’entre eux. Ils sont protégés mon ami. Vous les touchez et vous obtiendrez une erreur de syntaxe officielle.
alias and BEGIN begin break case class def defined do else elsif END end ensure false for if in module next nil not or redo rescue retry return self super then true undef unless until when while yield
OK. Ce sont les illustres membres du langage Ruby. Nous allons en bouffer pendant les trois prochains chapitres, assemblant ces parties en de rusés petits bouts de code (poignant).
Je recommande de lire toutes les parties du discours encore une fois. Ayez-en une bonne vue d’ensemble. Je vous testerai dans la prochaine partie.

Je suis fier de vous. Tout le monde vous²q dira combien je vante vos mérites. Combien je glorifie cette personne anonyme, là-bas, qui fait défiler son écran et lit, et fait défiler son écran et lit. “Ces enfants”, leur dis-je. “Mec, ces enfants m’ont eu. Je n’ai jamais …” Et je ne peux même pas finir ma phrase car je pleure comme un veau.
Et mon coeur brille d’un rouge vif sous ma peau vaporeuse et translucide, et ils doivent m’injecter 10 cm3 de Javascript pour me rétablir. (Je réponds bien au drogues dans le sang.) Mec, ce truc vous ferez sauter les pêches hors des ouies!
Et oui. Vous avez gentillement persévéré . Mais maintenant je dois commencer à devenir un maître d’école brutal. Je dois commencer à voir de bonnes notes de votre part. Jusqu’à présent vous n’avez rien fait d’autre que beaucoup bouger vos yeux. OK, bien sûr vous avez fait quelques lectures à haute voix exceptionnelles plus tôt. Mais maintenant, Smotchkkiss, nous allons avoir besoin de quelques talents de compréhension.
Prononcez à haute voix les parties du discours utilisées plus bas.
5.times { print "Odelay!" }
Vous pouvez même vouloir revoir ce paragraphe pendant que vous lisez, car vos yeux voudront sauter vers la réponse. Nous avons le nombre 5, suivi de la méthode .times. Ensuite la première paire de pince de crabe du bloc. La méthode du kernel print n’a pas de point et est suivie par la chaîne de caractères "Odelay!". La paire de pince de crabe terminale ferme notre bloc.
Prononcez à haute voix les parties du discours utilisées plus bas.
exit unless "restaurant".include? "aura"
A l’instar de la méthode print, exit est une méthode du kernel. Si vous avez fait attention lors de la grande list de mots-clé, vous savez que unless est un mot-clé. La chaine de caratères "restaurant" est suivi de la méthode include?. Et enfin, la chaîne de caratères "aura".
Prononcez à haute voix les parties du discours utilisées plus bas.
['pain', 'fromage', 'vin'].each { |food| print( food.capitalize ) }
Cette chenille participe à notre délicat festin. Cet exemple commence par un tableau. Dans ce tableau, trois chaînes de caratères: 'pain', 'fromage', et 'vin'. Ce tableau est suivi par la méthode each.
A l’intérieur d’un bloc, l’argument de bloc food descend par son toboggan à l’intérieur du bloc. La méthode capitalize met ensuite en majuscule la première lettre de l’argument de bloc, qui est devenu la variable food. Cette chaîne est alors passée à la méthode de kernel print.
Relisez encore ces exemples. Soyez sûr de reconnaitre les différentes parties du discours utilisées. Elles ont toutes un look différent, n’est-ce-pas? Prenez une inspiration profonde, appuyez fermement sur vos tempes. Maintenant, disséquons un bout de code.

Prononcez à haute voix les parties du discours utilisées plus bas.
require 'net/http'
Net::HTTP.start( 'www.ruby-lang.org', 80 ) do |http|
print( http.get( '/en/LICENSE.txt' ).body )
endLa prmière ligne est un appel à une méthode. La méthode appelée require est utilisée. Une chaîne de caractère contenant 'net/http' est passée à la méthode. Voyez cette première ligne de code comme une phrase. Nous avons demandé à Ruby de charger un code sensé nous aider, la bibliothèque Net::HTTP.
Les trois lignes suivantes vont toutes ensembles. La constante Net::HTTP se rapporte à la bibliothèque que nous venons de charger précédemment. Nous utilisons la méthode start de cette bibliothèque. Nous envoyons à la méthode la chaîne de caractères 'www.ruby-lang.org' et le nombre 80.
Le mot do ouvre un bloc. Ce bloc possède une variable de bloc http. Dans ce block, la méthode print est appelée. Qu’est-ce qui va être affiché?
La méthode get est appelée depuis la variable http. Nous passons à get une chaîne de caractères contenant le chemin '/en/LICENSE.txt'. Maintenant, remarquez qu’une autre méthode est enchainée avec get. La méthode body. Puis le bloc se termine avec un end.
Tout va bien? Juste par curiosité, pouvez-vous deviner ce que fait cet exemple? J’espère que vous voyez certains motif de Ruby. Sinon, remuez votre tête vigouresement pendant que vous avez ces exemples à l’esprit. Le code devrait se casser en de petites sections que vous devriez comprendre.
Par exemple, ce motif est utilisé plusieurs fois:
variable . méthode ( argument de méthode )
Vous le voyez dans le bloc:
http.get( '/en/LICENSE.txt' )
On utilise Ruby pour obtenir une page web. Vous avez sans doute déjà utilisé HTTP avec votre browser. HTTP est l’Hypertext Transfer Protocol. HTTP est utilisé pour transférer des pages web à travers Internet. Imaginez un conducteur de bus qui pourrait conduire à travers Internet et vous ramener des pages web. Sur son chapeau, brillent les lettres HTTP.
La variable http est ce conducteur de bus. La méthode est un message au conducteur de bus. Va chercher (NDT: get en anglais) la page web nommée /en/LICENSE.txt.
Aussi, là où vous verrez:
http.get( '/en/LICENSE.txt' ).body
Comme nous récupérons une page web de la part du conducteur de bus nommé http, vous pouvez le lire dans votre esprit comme:
page web .body
Et ce bout de code:
print( http.get( '/en/LICENSE.txt' ).body )
Ce code récupère la page web. Nous envoyons un message body à cette page web, ce qui nous donne tout l’HTML dans une chaîne de caractères. On affiche (NDT: print en anglais) ensuite cette chaine. Vous voyez comme le motif point-méthode est utilisé de façon chainée. Le prochain chapitre explorera ce genre de motifs en Ruby. Ce sera marrant.
Alors, que fait ce code? Il affiche le code HTML de la “home page” du sitre officiel de Ruby à l’écran. En utilisant un conducteur de bus branché au web.

Bien, maintenant nous avons un problème. J’ai l’impression que cette façon d’apprendre vous plait un peu trop. Et vous n’avez pas encore atteint le chapitre où j’utilise des chansons de saut à la corde pour vous aider à apprendre comment analyser du XML!
Si celà vous plait déjà, alors les choses vont vraiment mal. Dans deux chapitres, vous écrirez vos propres programmes en Ruby. En fait, c’est juste là que je vous ferai écrire votre propre jeu de rôle, votre propre réseau de partage de fichiers (à la BitTorrent) ainsi qu’un programme qui récupèrera des nombres aléatoires depuis Internet.

Et vous savez (vous devez savoir!) que celà va devenir une obsession. D’abord vous allez complètement oublier de sortir le chien. Il attendra près de la porte de votre bureau, tournant sa tête vers vous, alors que vos yeux dévoreront le code, que vos doigts enverront des messages à l’ordinateur.
A cause de votre négligence, les choses vont commencer à aller mal. Vos tas de feuilles imprimées de code vont recouvrir vos conduits d’aération. Votre chaudière va se boucher. Les ordures vont s’amonceler: des boites à emporter que vous aurez commandé précipitamment, du courrier inoportun. Votre propre crasse polluera l’air. La mousse gagnera le chevron, les arrivées d’eau vont se boucher, les animaux entreront, et les arbres pousseront depuis les fondations.
Mais vous prendrez soin de votre ordinateur. Et vous, Smotchkkiss, le nourrirez avec votre connaissance. Au cours des éternités que vous aurez passé avec votre machine, vous serez devenu à moitié CPU. Et il sera devenu à moitié humain. Vos bras pénètreront directement dans les ports de votre ordinateurs. Vos yeux accepteront la video directement depuis une broche DVI-24. Vos poumons se trouveront juste au dessus du processeur, et le refroidiront.
Et juste comme la pièce sera prête à se refermer sur vous, juste comme tout cette luxuriance va vous avaler vous et votre ordinateur, vous terminerez votre script. Vous et votre machine, ensemble, ferez marcher ce dernier script Ruby, le produit de votre obsession. Et le script lancera des tronçonneuses pour couper les arbres, des cheminées pour aider à réchauffer la maison. Des nano-robots constructeurs sortiront de votre script pour reconstruire votre intérieur, re-carreler, rénover, chromer, polir et désinfecter. D’immenses piliers se dresseront, et des statues seront sculptées. Vous maintiendrez ce palais sous votre domination ainsi que les montagnes et îles qui entourent votre forteresse.
Bon je pense que l’on va être d’accord. Qu’est-ce-que tu dis? Attaquons ce script?
![[o]](i/chapter.poignant.guide-4.jpg)

Je n’ai jamais vu un jambon faire autre chose que de perdre du jus. Aujourd’hui, dans les Cavernes d’Ambroise nous allons nous occuper de l’elfe. Il joue un rôle clé dans les prochaines leçons. Accueuillons le chaleureusement. Commencez à faire chauffer vos chapeaux d’écoute! (Et s’il vous plait, changez moi ce ridicule pantalon à étriers.)
Un petit avertissement: cette leçon est beaucoup plus lente. Suivez là. Ce sera une longue et profonde respiration. L’étape la plus cruciale de votre instruction. Vous pouvez avoir tout d’abord l’impression que vous n’apprenez pas beaucoup à coder. Vous apprendrez des concepts. a la fin de ce chapitre, vous connaitre la beauté de Ruby. Le confort apporté par le code deviendra un sac de couchage pour votre propre réconfort.
Trés bien, l’Elfe. Expliquez nous rapidement les problèmes de monnaie que vous rencontrez dans votre royaume.

Hum, ce n’est pas ce dont je me rappelais. Cet Elfe m’appelait constament. Quand j’ai refusé de le rappeler, il a laissé un message sur mon pager. C’est à dire: il a bippé quelques fois et a ensuite imprimé un petit morceau de papier. Ce morceau disait quelque chose qui ressemblait à “Descends vite ici!” et aussi “Nous devons débarasser la Terre du fléau que ce sont ces chenilles, ces insectes tordus étouffent mes cristaux bleus !”
Récemment, un taux de change a été instauré entre les feuilles et les cristaux. Un billet arboricole vaut cinq cristaux. Aussi la situation monétaire de base s’exprime comme ceci:
cristal_bleu = 1
feuille_tendre = 5Cet example ressemble totalement au dernier chapitre. C’est déjà un début. Nous assignons deux variables. Le signe egal est utilisé pour l’affectation.
Maintenant feuille_tendre représente le chiffre 5 (comme dans: cinq cristaux bleus.) Ce concept est la moitié de Ruby. Nous définissons. Nous créons. C’est la moitié du travail. L’affectation est la forme la plus basique de définition.
Vous ne pouvez quand même pas vous plaindre l’Elfe, n’est ce pas? Vous avez créé un empire en vendant vos cristaux bleus sur le nouveau marché entre les créatures de la forêt. (Et même s’il est un elfe pour nous, c’est un monstre immense pour eux.)

Nonono. Hang on a sec. You’re not ready for what the Elf here is doing in his caves. You’ll think it’s all positively inhumane, naughty, sick, tweeested, yada yada.
Back, back, way back before speedboats, I owned a prize race horse who took a stumble on the track. She did ten front flips and crashed into a guy who was carrying a full jar of mayonnaisse. We had blood and mayonnaisse up and down the track. Needless to say, she was a disaster.
The vet took one look at her and swore she’d never walk again. Her legs were gone and the vet wouldn’t allow a legless horse to just sit around. We’d need to put her down. He swore his life and career on it, insisting we divide into two parallel lines. The people who could not refute the doctor’s claims on one side; those too stubborn to accept his infallable medical reasoning on the other. The Elf, his pet ham, and I were the only ones in that second line.
So while the others heaped up trophies and great wreaths around the horse, bidding it a fond farewell before the bullet came to take him home, the Elf and I frantically pawed the Internet for answers. We took matter into our own hands, cauterizing her leg wounds with live crawdads. It worked great! We now had a horse again. Or at least: a horse body with a crustaceous abdominal frosting.
She scurried everywhere after that and lived for years in pleasantly moist underground cavities.
Animal Perfect is now the future of animal enhancement. They build new animals and salvage old-style animals for parts. Of course, they’ve come a long ways. When Animal Perfect started, you’d see a full-grown bear walk into Animal Perfect and you’d see a full-grown bear with sunglasses walk out. Completely cheesy.
Stick around and you’ll see a crab with his own jet pack. That’s a new 2004 model jetcrab.
But now, the whole operation is up and running. And the cleanliness of the place is astonishing. All the equipment is so shiny. Everything is in chrome. Oh, and all the staff have concealed weapons. They’re trained to kill anyone who enters unannounced. Or, if they run out of bullets, they’re trained to pistol whip anyone who enters unannounced.
Elf, make me a starmonkey.

Some imaginary Ruby for you:
pipe.catch_a_star
Variable pipe. Method catch_a_star. A lot of Rubyists like to think of methods as a message. Whatever comes before the dot is handed the message. The above code tells the pipe to catch_a_star.
This is the second half of Ruby. Putting things in motion. These things you define and create in the first half start to act in the second half.
So what if the star catching code works? Where does the star go?
captive_star = pipe.catch_a_star
See, it’s up to you to collect the miserable, little star. If you don’t, it’ll simply vanish. Whenever you use a method, you’ll always be given something back. You can ignore it or use it.
If you can learn to use the answers that methods give you back, then you will dominate.

Quickly then.
starmonkey = ratchet.attach( captive_monkey, captive_star )
The ratchet gets an attach message. What needs to be attached? The method arguments: the captive_monkey and the captive_star. We are given back a starmonkey, which we have decided to hang on to.

This is turning out to be such a short, little proggie that I’m just going to put it all together as one statement.
starmonkey = ratchet.attach( captive_monkey, pipe.catch_a_star ) + deco_hand_frog
See how pipe.catch_a_star is right in the arguments for the method? The caught star will get passed right to the ratchet. No need to find a place to put it. Just let it go.

The hotel here in Ambrose is no good at all. The beds are all lumpy. The elevator is tiny. One guy put all his bags in the elevator and found out there wasn’t room for him. He hit the button and chased up the stairs after it all. But the stairwell turned out to be too narrow and his shoulders got wedged going up.
The soap mini-bars they give you are sized down for elves, so it’s impossible to work up a lather. I hate it. I keep mistaking them for contact lenses.
I turned on the faucet and nothing came out. Thing is: Ambrose is a place with magical properties, so I took a chance. I put my hands under the spigot. Invisible, warm wetness. I felt the hurried sensation of running water, darting through my fingers. When I took my hands away, they were dry and clean.
It was an amazing nothingness to experience. It was just like nil.
In Ruby, nil represents an emptiness. It is without value. It isn’t zero. Zero is a number.
It’s Ruby’s own walking dead, a flatlined keyword. You can’t add to it, it doesn’t evolve. But it’s terribly popular. This skeleton’s smiling in all the pictures.
plastic_cup = nil
The above plastic_cup is empty. You could argue that the plastic_cup contains something, a nil. The nil represents the emptiness, though, so go ahead and call it empty.
Some of you who have programmed before will be tempted to say the plastic_cup is undefined. How about let’s not. When you say a variable is undefined, you’re saying that Ruby simply has no recollection of the variable, it doesn’t know the var, it’s absolutely non-existent.
But Ruby is aware of the plastic_cup. Ruby can easily look in the plastic_cup. It’s empty, but not undefined.

The cat Trady Blix. Frozen in emptiness. Immaculate whiskers rigid. Placid eyes of lake. Tail of warm icicle. Sponsored by a Very Powerful Pause Button.
The darkness surrounding Blix can be called negative space. Hang on to that phrase. Let it suggest that the emptiness has a negative connotation. In a similar way, nil has a slightly sour note that it whistles.
Generally speaking, everything in Ruby has a positive charge to it. This spark flows through strings, numbers, regexps, all of it. Only two keywords wear a shady cloak: nil and false draggin us down.
You can test that charge with an if keyword. It looks very much like the do blocks we saw in the last chapter, in that both end with an end.
if plastic_cup
print "Plastic cup is on the up 'n' up!"
endIf plastic_cup contains either nil or false, you won’t see anything print to the screen. They’re not on the if guest list. So if isn’t going to run any of the code it’s protecting.
But nil and false need not walk away in shame. They may be of questionable character, but unless runs a smaller establishment that caters to the bedraggled. The unless keyword has a policy of only allowing those with a negative charge in. Who are: nil and false.
unless plastic_cup
print "Plastic cup is on the down low."
endYou can also use if and unless at the end of a single line of code, if that’s all that is being protected.
print "Yeah, plastic cup is up again!" if plastic_cup
print "Hardly. It's down." unless plastic_cupAnd another nice trick: stack the if and unless.
print "We're using plastic 'cause we don't have glass." if plastic_cup unless glass_cupThis trick is a gorgeous way of expressing, Do this only if a is true and b isn’t true.
Now that you’ve met false, I’m sure you can see what’s on next.
approaching_guy = true
I saw true at the hotel buffet tables today. I cannot stand that guy. His stance is way too wide. And you’ve never met anyone who planted his feet so hard in the ground. He wears this corny necklace made out of shells. His face exudes this brash confidence. (You can tell he’s exerting all of his restraint just to keep from bursting into Neo flight.)
To be honest, I can’t be around someone who always has to be right. This true is always saying, “A-OK.” Flashing hang ten. And seriously, he loves that necklace. Wears it constantly.
As you’d suspect, he’s backstage at everything on the if event schedule.
print "Hugo Boss" if trueacts likeprint "Hugo Boss".
Occassionally, if will haul out the velvet ropes to exercise some crowd control. The double equals gives the appearance of a short link of ropes, right along the sides of a red carpet where only true can be admitted.
if approaching_guy == true
print "That necklace is classic."
endThe double equals is simply an ID check. Do the gentleman at both ends of this rope appear to match?
In this way, you control who if lets in. If you have a hard time getting along with true as I do, you can heartily welcome false.
if approaching_guy == false
print "Get in here, you conniving devil."
endSame goes for unless. The gateway is yours. Take possession of it.
Now, you want a head trip? The double equals sign is a method. Can you guess how it works? Here, check it out with the dot and parens:
approaching_guy.==( true )
Ruby allows the shortcut, though. You can drop the dot and back away slowly.
Now, do you remember what you need to do to dominate in Ruby? Use the answers the methods give you.
if nil.==( true )
print "This will never see realization."
endIn the above, how is the method’s answer being used?
Let’s take the statement nil == true. This will fail every time. No match. When there’s no match, the double equals method answers with false. A shake of the head. That answer is given to if, who can’t accept a false. The print never sees realization.
at_hotel = true
email = if at_hotel
"why@hotelambrose.com"
else
"why@drnhowardcham.com"
endEven though if isn’t a method, if does give a return answer. Look at the above and wonder over what happens when at_hotel is true.
The if will return the answer given by the code it chooses to run. In the case of at_hotel being true, the first string, my e-mail address at Hotel Ambrose, will be returned. The else keyword marks code which will run, should if fail. If at_hotel is false, the if will answer with my e-mail address at Dr. N. Howard Cham’s office, where I take my apprenticeship.
Should you have several lines of code in an if or unless, only the answer from the last full statement will be used.
email = if at_hotel
address = "why"
address << "@hotelambrose"
address << ".com"
endThree lines of code inside the if. The first line assigns a string with my name in it to a variable. The second and third lines add the rest of my e-mail address on to the end. The double less-than << is the concatenation operator. To concatenate is to append, or add to the end.
Just as we saw with the equality checker ==, the concatenator is a method. After adding to the end of the string, the concatenator also answers with that very string. So, the third line, which could be read as address.<<( ".com" ), gives back address, which the if then hands back for email’s assignment.
Here’s a question: what if the if fails? What if at_hotel is false in the above example? Is anything returned? Nothing is assigned to email, right?
Yes, nothing is returned. By which I mean: nil is returned. And often nil is a very useful answer.
print( if at_hotel.nil?
"No clue if he's in the hotel."
elsif at_hotel == true
"Definitely in."
elsif at_hotel == false
"He's out."
else
"The system is on the freee-itz."
end )You can use the nil? method on any value in Ruby. Again, think of it as a message. To the value: “Are you nil? Are you empty?”
If at_hotel is empty, Ruby doesn’t have any idea if I’m in the hotel or not. So if answers with the “No clue” string. In order to handle the true or false possibilities, the elsif keyword is used. While you can have only one if and one else, you can fill the inbetween with an exorbitant number of elsif keywords. Each elsif acts as a further if test. Checking for a positive charge.
If you’re doing okay at this point, then you’re in tip-top shape for the rest of the book. You have seen some pretty tough code in the last few examples. You strong fellow.

You finish reading the above comic and retire to your daybed for reflection. It’s one of those canopy affairs which is always logjammed with pillows. You sit atop the pile, gazing out upon the world. You see the tall smokestacks belching wide spools of fume and haze. The tangled concourses of freeways smattered with swift, shimmering traffic is but a gently pulsing eye muscle from your vantage point.
It is all so fantastic. How the colors of the horizon spread across the landscape as a great mix of butter and grease with a tablespoon of vanilla extract.
Yet, for all of the beauty which beckons for your attention, the images of the Elf and his Olympic Hopeful return. And more especially, that order for 55,000 starmonkeys. 55,000 starmonkeys, you think. Fifty-five Thousand.
You think of just the number itself. 55,000. It’s walking down a road. It might be in a forest, you don’t know for sure as your eyes are fixed right on the number itself. It’s stopping and talking to people. To tennis players, to a men’s choral group. There is merriment and good feeling. When it laughs, its lower zeros quiver with glee.
You want to talk to it. You want to skip along that forest trail with it. You want to climb aboard a jet bound to Brazil with it. And after five days and four nights at the leisureful Costa do Sauipe Marriott Resort & Spa, to marry it, to bear a family of 55,000 starmonkeys with it. To take possession of Nigeria with it.
With a flying leap, you dismount your pillow tower of isolation. Scrambling with the key, you unlock your roll top desk and pull out a sheet of paper, holding it firmly upon the desk. You begin scribbling.
Take possession of Nigeria with my new 55,000 starmonkeys… Over it, build Nigeria-sized vegetarians only casino and go-cart arena… Wings… we could have our own special sauce on the wings that’s different… Mustard + codeine = Smotchkkiss’ Starry Starmonkey Glow Sauce… Franchise, franchise… logos… Employee instructional videos… When you give the customer change, let them reach inside the frog on your hand to get it… If they have no change, at least put their reciept some place where they have to touch the frog… We’re leveling the playing field here… Advertise cheap pizza, let’s make our money off soda… Collect all 4 frosted glasses…
Wow, the ideas are really coming out. You literally had to smack yourself to stop. We need to put these in a safe place. Actually, we should store them on your computer and mangle the words. You look out the window and watch for FBI. I’m going to start this script.
print "Type and be diabolical: "
idea_backwards = gets.reverseLet this script be your confidante. It will ask for evil plans and turn their letters backwards. The gets method is built into Ruby. It’s a kernel method like print. This method gets will pause Ruby to let you type. When you hit Enter, gets will then stop paying attention to your keyboard punchings and answer back to Ruby with a string that contains everything you typed.
The reverse method is then used on the string that gets is giving back. The reverse method is part of the String class. Which means that anything which is a string has the reverse method available. More on classes in the next chapter, for now just know that a lot of methods are only available with certain types of values.
I don’t think reverse is going to cut it. The authorities only need to put a mirror to “airegiN fo noissessop ekaT.” Bust us when starmonkeys start to touch down in Lagos.
The capital letters give it away. Maybe if we uppercase all letters in the string before we reverse it.
idea_backwards = gets.upcase.reverseYou hand me a legal pad, doused in illegible shorthand. Scanning over it, I start to notice patterns. That you seem to use the same set of words repeatedly in your musings. Words like starmonkey, Nigeria, firebomb. Some phrases even. Put the kabosh on. That gets said a lot.
Let us disguise these foul terms, my brother. Let us obscure them from itching eyes that cry to know our delicate schemes and to thwart us from having great pleasure and many go-carts. We will replace them with the most innocent language. New words with secret meaning.
I start up a word list, a Ruby Hash, which contains these oft seen and dangerous words of yours. In the Hash, each dangerous word is matched up against a code word (or phrase). The code word will be swapped in for the real word.
code_words = {
'starmonkeys' => 'Phil and Pete, those prickly chancellors of the New Reich',
'catapult' => 'chucky go-go', 'firebomb' => 'Heat-Assisted Living',
'Nigeria' => "Ny and Jerry's Dry Cleaning (with Donuts)",
'Put the kabosh on' => 'Put the cable box on'
}The words which are placed before the arrow are called keys. The words after the arrows, the definitions, are often just called values.
Notice the double quotes around Ny and Jerry's Dry Cleaning (with Donuts). Since a single quote is being used an apostrophe, we can’t use single quotes around the string. (Although, you can use single quotes if you put a backslash before the apostrophe such as: 'Ny and Jerry\'s Dry Cleaning (with Donuts)'.)
Should you need to look up a specific word, you can do so by using the square brackets method.
code_words['catapult']will answer with the string'chucky go-go'.
Look at the square brackets as if they are a wooden pallet the word is sitting upon. A forklift could slide its prongs into each side of the pallet and bring it down from a shelf back in the warehouse. The word on the pallet is called the index. We are asking the forklift to find the index for us and bring back its corresponding value.
If you’ve never been to a warehouse, you could also look at the brackets as handles. Imagine an industrious worker putting on his work gloves and hefting the index back to your custody. If you’ve never used handles before, then I’m giving you about thirty seconds to find a handle and use it before I blow my lid.
As with many of the other operators you’ve seen recently, the index brackets are simply a shortcut for a method.
code_words.[]( 'catapult' )will answer with the string'chucky go-go'.
I went ahead and saved the Hash of code words to a file called wordlist.rb.
require 'wordlist'
# Get evil idea and swap in code words
print "Enter your new idea: "
idea = gets
code_words.each do |real, code|
idea.gsub!( real, code )
end
# Save the jibberish to a new file
print "File encoded. Please enter a name for this idea: "
idea_name = gets.strip
File::open( "idea-" + idea_name + ".txt", "w" ) do |f|
f << idea
endScript starts by pulling in our word list. Like gets and print, the require method is a kernel method, you can use it anywhere. I give it the string 'wordlist' and it will look for a file named wordlist.rb.
After that, there are two sections. I am marking these sections with comments, the lines that start with pound symbols. Comments are useful notes that accompany your code. Folks who come wandering through your code will appreciate the help. When going through your own code after some time has passed, comments will help you get back into your mindset. And there’s software out there that can take your comments and build documents from them. (RDoc and Ri—see Expansion Pak #1!)
I like comments because I can skim a big pile of code and spot the highlights.
As the comments tell us, the first section asks you for your evil idea and swaps in the new code words. The second section saves the encoded idea into a new text file.
code_words.each do |real, code|
idea.gsub!( real, code )
endYou see the each method? The each method is all over in Ruby. It’s available for Arrays, Hashes, even Strings. Here, our code_words dictionary is kept in a Hash. This each method will hurry through all the pairs of the Hash, one dangerous word matched with its code word, handing each pair to the gsub! method for the actual replacement.
In Ruby, gsub is short for global substitution. The method is used to search and replace. Here, we want to find all the occurences of a dangerous word and replace with its safe code word. With gsub, you provide the word to find as the first argument, then the word to put in its place as the second argument.
Why aren’t we hanging on to the answer from gsub? Doesn’t gsub give us an answer back that we should keep? You’d think the line would read:
safe_idea = idea.gsub( real, code )Yes, with gsub we’d need to hang on to its answer. We’re using a variation of gsub that is totally hyper. Notice the exclamation mark on the gsub! used inside the each block. The exclamation mark is a sign that gsub! is a bit of a zealot. See, gsub! will go ahead and replace the words in idea directly. When it’s done idea will contain the newly altered string and you won’t be able to find the old string.
Call gsub! a destructive method. It makes its changes to the value directly. Whereas gsub will leave the value intact, answering back with a new string which contains the alterations. (Why must gsub! scream when he descends upon his prey? Merciless assailant!)
Let us now save the encoded idea to a file.
# Save the jibberish to a new file
print "File encoded. Please enter a name for this idea: "
idea_name = gets.strip
File::open( '