Ако погледнем по-отблизо нашата нова програма, ще забележим, че
присъства ред, който започва с #. В Ruby всичко, което започва с # е
коментар и не се интерпретира. Конкретно в нашия пример се ползва
специален случай, който показва как да бъде стартиран файла под
UNIX-подобни операционни системи.

Въведохме известна промяна в метода `say_hi`\:

<figure class="highlight"><pre><code class="language-ruby" data-lang="ruby"><span class="c1"># Say hi to everybody</span>
<span class="k">def</span> <span class="nf">say_hi</span>
  <span class="k">if</span> <span class="vi">@names</span><span class="p">.</span><span class="nf">nil?</span>
    <span class="nb">puts</span> <span class="s2">"..."</span>
  <span class="k">elsif</span> <span class="vi">@names</span><span class="p">.</span><span class="nf">respond_to?</span><span class="p">(</span><span class="s2">"each"</span><span class="p">)</span>
    <span class="c1"># @names is a list of some kind, iterate!</span>
    <span class="vi">@names</span><span class="p">.</span><span class="nf">each</span> <span class="k">do</span> <span class="o">|</span><span class="nb">name</span><span class="o">|</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="k">end</span>
  <span class="k">else</span>
    <span class="nb">puts</span> <span class="s2">"Hello </span><span class="si">#{</span><span class="vi">@names</span><span class="si">}</span><span class="s2">!"</span>
  <span class="k">end</span>
<span class="k">end</span></code></pre></figure>

В горния пример правим проверка на параметъра `@names` за да вземем
решение. Ако е nil, отпечатваме три точки.

## Цикли, познати като итерации

Ако обектът `@names` отговаря на `each`, би следвало да можем да минем
през всеки един от неговите елементи и да отпечатаме неговата стойност.
Ако това не стане, просто превръщаме обекта в низ и отпечатваме
стандартния поздрав.

Нека разгледаме итератора от близо:

<figure class="highlight"><pre><code class="language-ruby" data-lang="ruby"><span class="vi">@names</span><span class="p">.</span><span class="nf">each</span> <span class="k">do</span> <span class="o">|</span><span class="nb">name</span><span class="o">|</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="k">end</span></code></pre></figure>

Методът `each` приема блок с код, който се изпълнява за всеки елемент от
списъка, бит по бит, между ключовите думи `do` и `end.  Блокът е като
анонимната функция @lambda`. Променливата между вертикалните черти е
параметъра за този блок.

В повечето езици за програмиране се ползва цикъл като `for` за обхождане
на списъка, като това става на C по следния начин:

<figure class="highlight"><pre><code class="language-c" data-lang="c"><span class="k">for</span> <span class="p">(</span><span class="n">i</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span> <span class="n">i</span><span class="o">&lt;</span><span class="n">number_of_elements</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">)</span>
<span class="p">{</span>
  <span class="n">do_something_with</span><span class="p">(</span><span class="n">element</span><span class="p">[</span><span class="n">i</span><span class="p">]);</span>
<span class="p">}</span></code></pre></figure>

Този вариант работи, но не е най-елегантното решение. Имаме нужда от
променлива i, големината на списъка и описание на начина на обхождане. В
Ruby това става много елегантно, като всички детайли са скрити в метода
`each`. Вътрешната реализация на този метод просто извиква `yield
"Albert"`, след това `yield "Brenda"` и накрая `yield "Charles"`

## Блокът, блясъкът на Ruby

Истинската мощ на блоковете може да видим в обработката на сложни
списъци.

<figure class="highlight"><pre><code class="language-ruby" data-lang="ruby"><span class="c1"># Say bye to everybody</span>
<span class="k">def</span> <span class="nf">say_bye</span>
  <span class="k">if</span> <span class="vi">@names</span><span class="p">.</span><span class="nf">nil?</span>
    <span class="nb">puts</span> <span class="s2">"..."</span>
  <span class="k">elsif</span> <span class="vi">@names</span><span class="p">.</span><span class="nf">respond_to?</span><span class="p">(</span><span class="s2">"join"</span><span class="p">)</span>
    <span class="c1"># Join the list elements with commas</span>
    <span class="nb">puts</span> <span class="s2">"Goodbye </span><span class="si">#{</span><span class="vi">@names</span><span class="p">.</span><span class="nf">join</span><span class="p">(</span><span class="s2">", "</span><span class="p">)</span><span class="si">}</span><span class="s2">.  Come back soon!"</span>
  <span class="k">else</span>
    <span class="nb">puts</span> <span class="s2">"Goodbye </span><span class="si">#{</span><span class="vi">@names</span><span class="si">}</span><span class="s2">.  Come back soon!"</span>
  <span class="k">end</span>
<span class="k">end</span></code></pre></figure>

Методът `say_bye` не използва `each`, а вместо това прави проверка дали
`@names` отговаря на метода `join` и при положителен резултат го ползва.
При отрицателен резултат просто отпечатва променливата като низ. Този
метод не се интересува от типа на променливата, а се уповава на
методите, на които отговаря, като това е познато като “Duck Typing” –
“ако ходи като патица и кряка като патица, би трябвало да е патица”. По
този начин не сме ограничени от типа на променливите. Ако някой друг
напише подобен клас, единственото нещо, което трябва да присъства е
имплементацията на метода `join` за да може всичко да работи правилно.

## Стартиране на скрипта

Ползваме един последен трик за стартиране на скрипта:

<figure class="highlight"><pre><code class="language-ruby" data-lang="ruby"><span class="k">if</span> <span class="kp">__FILE__</span> <span class="o">==</span> <span class="vg">$0</span></code></pre></figure>

`__FILE__` е специална променлива, която съдържа името на настоящия
файл, а `$0` представлява името на файла, нужен за стартирането на
програмата. Тази проверка има следното значение: “Ако това е главния
изпълним файл ...”. Това ни позволява да ползваме скрипта като
библиотека.

## Вместо край на ръководството

Тук приключва краткото въведение в Ruby. Надяваме се това да Ви е
запалило да научите и използвате този прекрасен език. Ако това е така,
можете да прегледате раздела [Документация](/bg/documentation/) , където
ще намерите връзки към напълно безплатни самоучители и ръководства.
