いちいち入力せずに、何度も“Hello”と言いたい時にはどうすればいいでしょうか？
メソッドを定義しましょう！

<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">hi</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="ss">:hi</span></code></pre></figure>

`def hi`というコードがメソッド定義のはじまりになります。
これは、`hi`という名前のメソッドを定義しようとしていることをRubyに伝えるものです。
次の行はメソッドの本体になります。この行は、すでに見た行、`puts "Hello World"`と
同じものです。
そして、最後の行の `end` は、メソッド定義が終わったことをRubyに伝えます。
Rubyのレスポンス `=> :hi` は、メソッド定義の終了を理解したことを表しています。
なお、Ruby 2.0やそれ以前のバージョンのRubyでは、このレスポンスは `=> nil`
になります。が、その違いはここでは特に重要なことではないので、先に進みます。

## 簡潔で繰り返せるメソッド

それではこのメソッドを何度か実行してみましょう。

<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">hi</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">hi</span><span class="p">()</span>
<span class="go">Hello World!
</span><span class="p">=&gt;</span> <span class="kp">nil</span></code></pre></figure>

簡単ですね。Rubyでのメソッド呼び出しはその名前をRubyに伝えるのと同じくらい簡単です。
引数がなければ、名前以外は不要です。
メソッドが引数を持たない場合、メソッド名の後ろに空のカッコをつけることができますが、
省略しても構いません。

全世界ではなく、特定の人にhelloと言いたい場合はどうすればいいでしょうか？
名前を引数としてとるように`hi`を再定義すればいいのです。

<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">hi</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="ss">:hi</span>
<span class="gp">irb(main):018:0&gt;</span><span class="w"> </span><span class="n">hi</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>

ちゃんと動いているようです。しかし、ここで何が起きているのか、ちょっと詳しく見てみましょう。

## Stringに穴を開ける

`#{name}`とは一体何なのでしょうか。これは、文字列に何かを挿入する際の
Rubyでのやり方なのです。
ブレースの間にあるものは（もし文字列でなければ）文字列に変換され、
その外側の文字列の中に置き換えられます。
このしくみは、誰かの名前を正しくcapitalizedするのにも使えます。

<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">hi</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="ss">:hi</span>
<span class="gp">irb(main):022:0&gt;</span><span class="w"> </span><span class="n">hi</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">hi</span>
<span class="go">Hello World!
</span><span class="p">=&gt;</span> <span class="kp">nil</span></code></pre></figure>

ここでは他にもいろいろなトリックが使われています。
一つはカッコなしでメソッド呼び出しが使われていることです。
何をやっているか明確であれば、カッコは省略できます。
それ以外のトリックは、デフォルト引数の`World`です。
これは、「もしnameが与えられなければ、nameのデフォルト値である`"World"`を
使う」という定義になります。

## 挨拶人(Greeter)への進化

もし本物の挨拶人がいたのなら、あなたの名前を覚えてくれる上、
歓迎し、いつでも丁重に扱ってくれるでしょう。
そのためにオブジェクトを使いたくなりそうです。
“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="ss">:say_bye</span></code></pre></figure>

新しいキーワードは`class`です。これはGreeterという新しいクラスと、
そのクラスのメソッドをいくつか定義しています。また、`@name`にも
気づいたかもしれません。これはインスタンス変数で、このクラスにある
全てのメソッドで使うことができます。見ての通り、
`say_hi` と `say_bye`で使われています。

さて、どうすればこのGreeterクラスを動かせるでしょうか？
[オブジェクトを作りましょう。](../3/)
