Як сказати “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` починає визначення методу. Він повідомляє Ruby, що ми
визначаємо метод і що його назва — `hi`. Наступний рядок — це тіло методу,
той самий рядок, який ми бачили раніше: `puts "Hello World"`.
Нарешті, останній рядок `end` повідомляє Ruby, що ми завершили визначення
методу. Відповідь Ruby `=> :hi` говорить, що він зрозумів завершення.
Ця відповідь могла б бути `=> nil` для Ruby 2.0 і попередніх версій.
Але це тут неважливо, тож продовжимо.

## Коротке, повторюване життя методу

Тепер спробуймо викликати цей метод кілька разів:

<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 так само легко, як просто
згадати його ім’я. Якщо метод не приймає параметрів — це все, що потрібно.
Можна додати порожні дужки, якщо хочете, але вони не обов’язкові.

А що, якщо ми хочемо привітатися з однією людиною, а не з усім світом?
Просто перевизначте `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>

Отже, працює… але давайте на хвилину розберемося, що тут відбувається.

## Підстановки у рядку

Що означає `#{name}`? Це спосіб Ruby вставити щось у рядок.
Те, що між фігурними дужками, перетворюється на рядок (якщо ще не є ним),
а потім підставляється у зовнішній рядок у цьому місці. Ви також можете
використати це, щоб правильно капіталізувати ім’я:

<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`. Це означає: “Якщо ім’я не передано, використовуй
значення за замовчуванням `"World"`”.

## Перетворення на привітальника

А що, якщо ми хочемо справжнього привітальника, який пам’ятатиме ваше
ім’я, вітатиме вас і завжди ставитиметься з повагою? Для цього можна
використати об’єкт. Створімо клас “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/)
