Admettons, pour la bonne continuité de ce tutoriel, que nous voulons
tout à coup répéter et répéter encore « Hello World » ... mais sans trop
nous fatiguer. Il va falloir définir une méthode.

<figure class="highlight"><pre><code class="language-irb" data-lang="irb"><span class="gp">irb(main):010:0&gt;</span><span class="w"> </span><span class="k">def</span> <span class="nf">h</span>
<span class="gp">irb(main):011:1&gt;</span><span class="w"> </span><span class="nb">puts</span> <span class="s2">"Hello World!"</span>
<span class="gp">irb(main):012:1&gt;</span><span class="w"> </span><span class="k">end</span>
<span class="p">=&gt;</span> <span class="kp">nil</span></code></pre></figure>

Le mot-clé `def` a ici pour rôle de commencer la définition d’une
méthode. Il dit tout simplement à Ruby que nous \[*attention !*\]
commençons à écrire \[*grands signes vers Ruby*\] une nouvelle méthode,
laquelle s’appelle `h`. La ligne suivante constitue le corps de notre
méthode ; en l’occurence, il s’agit de la ligne que nous avons écrite
auparavant, `puts "Hello World"`. Enfin, la dernière ligne, `end`,
indique à Ruby que la définition de la méthode s’arrête **là**. Après
avoir appuyé sur \[Entrée\], Ruby répond… `nil`, ce qui est sa façon à
lui de dire qu’il a bien compris et enregistré notre nouvelle méthode.

## Courte et morne vie d’une méthode…

Bien, essayons de faire fonctionner cette méthode deux ou trois fois,
pour voir :

<figure class="highlight"><pre><code class="language-irb" data-lang="irb"><span class="gp">irb(main):013:0&gt;</span><span class="w"> </span><span class="n">h</span>
<span class="go">Hello World!
</span><span class="p">=&gt;</span> <span class="kp">nil</span>
<span class="gp">irb(main):014:0&gt;</span><span class="w"> </span><span class="n">h</span><span class="p">()</span>
<span class="go">Hello World!
</span><span class="p">=&gt;</span> <span class="kp">nil</span></code></pre></figure>

Rien de très compliqué. Appeler une méthode en Ruby, c’est simplement
dire son nom, au minimum. Si la méthode n’attend pas de paramètres pour
préciser ce qu’elle doit faire, le nom suffira. Et d’ailleurs, vous
pouvez bien ajouter des parenthèses vides à une méthode qui n’attend
pas de paramètres : elles seront simplement ignorés.

Que faire si nous souhaitons dire bonjour à une personne en particulier,
et pas au monde entier ? Et bien, il suffit justement de demander à ce
que le nom de la personne concernée soit mentionné en tant que paramètre
de la méthode `h`\:

<figure class="highlight"><pre><code class="language-irb" data-lang="irb"><span class="gp">irb(main):015:0&gt;</span><span class="w"> </span><span class="k">def</span> <span class="nf">h</span><span class="p">(</span><span class="nb">name</span><span class="p">)</span>
<span class="gp">irb(main):016:1&gt;</span><span class="w"> </span><span class="nb">puts</span> <span class="s2">"Hello </span><span class="si">#{</span><span class="nb">name</span><span class="si">}</span><span class="s2">!"</span>
<span class="gp">irb(main):017:1&gt;</span><span class="w"> </span><span class="k">end</span>
<span class="p">=&gt;</span> <span class="kp">nil</span>
<span class="gp">irb(main):018:0&gt;</span><span class="w"> </span><span class="n">h</span><span class="p">(</span><span class="s2">"Matz"</span><span class="p">)</span>
<span class="go">Hello Matz!
</span><span class="p">=&gt;</span> <span class="kp">nil</span></code></pre></figure>

Ça fonctionne… mais pourquoi ? et comment ?

## Les chaînes des caractères

Le truc le plus étrange dans ce nouvel exemple est sûrement ce
`#{name}`. Il s’agit en fait du moyen le plus simple dont dispose Ruby
pour *insérer* quelque chose au sein d’une chaîne de caractère. Le mot
entre crochets, `name`, est à terme transformé en une chaîne de
caractère (sauf s’il en était déjà une, bien sûr) et incorporé à la
chaîne qui l’englobe (`"Hello !"`). Et comme, au départ, vous manipulez
une variable (`name`), vous pouvez lui passer des messages avec des
méthodes… Par exemple, lui demander de toujours débuter par une
majuscule avec `capitalize`\:

<figure class="highlight"><pre><code class="language-irb" data-lang="irb"><span class="gp">irb(main):019:0&gt;</span><span class="w"> </span><span class="k">def</span> <span class="nf">h</span><span class="p">(</span><span class="nb">name</span> <span class="o">=</span> <span class="s2">"World"</span><span class="p">)</span>
<span class="gp">irb(main):020:1&gt;</span><span class="w"> </span><span class="nb">puts</span> <span class="s2">"Hello </span><span class="si">#{</span><span class="nb">name</span><span class="p">.</span><span class="nf">capitalize</span><span class="si">}</span><span class="s2">!"</span>
<span class="gp">irb(main):021:1&gt;</span><span class="w"> </span><span class="k">end</span>
<span class="p">=&gt;</span> <span class="kp">nil</span>
<span class="gp">irb(main):022:0&gt;</span><span class="w"> </span><span class="n">h</span> <span class="s2">"chris"</span>
<span class="go">Hello Chris!
</span><span class="p">=&gt;</span> <span class="kp">nil</span>
<span class="gp">irb(main):023:0&gt;</span><span class="w"> </span><span class="n">h</span>
<span class="go">Hello World!
</span><span class="p">=&gt;</span> <span class="kp">nil</span></code></pre></figure>

D’autres petits ajouts ont eu lieu dans ce dernier bout de code. Tout
d’abord, nous n’appelons plus la méthode avec des parenthèses autour du
paramètre. Elles sont en effet optionnelles, et vous pouvez vous en
passer si ce que vous écrivez est trivial, comme c’est le cas ici.
Ensuite, nous avons défini une valeur par défaut pour le paramètre
`name`. Si la méthode est appelée sans que lui soit fourni un nom en
particulier, alors le nom prendra la valeur `"World"`.

## Un brin de politesse

L’accueil donné actuellement par notre méthode est un peu frustre… il ne
serait pas de trop d’avoir une formule plus respectueuse à l’encontre de
l’usager. Pour ce faire, nous utiliserons un objet. Et nous allons même
dans la foulée créer une classe, “Greeter”.

<figure class="highlight"><pre><code class="language-irb" data-lang="irb"><span class="gp">irb(main):024:0&gt;</span><span class="w"> </span><span class="k">class</span> <span class="nc">Greeter</span>
<span class="gp">irb(main):025:1&gt;</span><span class="w">   </span><span class="k">def</span> <span class="nf">initialize</span><span class="p">(</span><span class="nb">name</span> <span class="o">=</span> <span class="s2">"World"</span><span class="p">)</span>
<span class="gp">irb(main):026:2&gt;</span><span class="w">     </span><span class="vi">@name</span> <span class="o">=</span> <span class="nb">name</span>
<span class="gp">irb(main):027:2&gt;</span><span class="w">   </span><span class="k">end</span>
<span class="gp">irb(main):028:1&gt;</span><span class="w">   </span><span class="k">def</span> <span class="nf">say_hi</span>
<span class="gp">irb(main):029:2&gt;</span><span class="w">     </span><span class="nb">puts</span> <span class="s2">"Hi </span><span class="si">#{</span><span class="vi">@name</span><span class="si">}</span><span class="s2">!"</span>
<span class="gp">irb(main):030:2&gt;</span><span class="w">   </span><span class="k">end</span>
<span class="gp">irb(main):031:1&gt;</span><span class="w">   </span><span class="k">def</span> <span class="nf">say_bye</span>
<span class="gp">irb(main):032:2&gt;</span><span class="w">     </span><span class="nb">puts</span> <span class="s2">"Bye </span><span class="si">#{</span><span class="vi">@name</span><span class="si">}</span><span class="s2">, come back soon."</span>
<span class="gp">irb(main):033:2&gt;</span><span class="w">   </span><span class="k">end</span>
<span class="gp">irb(main):034:1&gt;</span><span class="w"> </span><span class="k">end</span>
<span class="p">=&gt;</span> <span class="kp">nil</span></code></pre></figure>

Évidemment, la nouveauté la plus importante ici est le mot-clé `class`.
Son rôle est de définir une nouvelle classe, en l’occurence `Greeter`,
laquelle classe *contient* plusieurs méthodes. Vous avez également
repéré `@name`. Il s’agit d’une « variable d’instance », qui sera
disponible pour toutes les méthodes de la classe `Greeter`. Elle est
d’ailleurs utilisée par les méthodes `say_hi` et `say_bye`.

Maintenant, il s’agit de donner vie à notre classe. Donc de [créer un
objet](../3/)...
