Así que, investigando nuestro programa, notarás que las primeras líneas
comienzan con un numeral (#). En Ruby, todo lo que esté detrás de un
numeral es un comentario y es ignorado por el intérprete. La primera
línea del archivo es un caso especial y en los sistemas operativos del
estilo Unix determina cómo ejecutar el archivo. El resto de los
comentarios están únicamente para aportar claridad al significado del
código.

Nuestro método `decir_hola` se ha vuelto un poco más complicado:

<figure class="highlight"><pre><code class="language-ruby" data-lang="ruby"><span class="c1"># Decirle hola a todos</span>
<span class="k">def</span> <span class="nf">decir_hola</span>
  <span class="k">if</span> <span class="vi">@nombres</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">@nombres</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"># @nombres es una lista de algún tipo,</span>
    <span class="c1"># ¡así que podemos iterar!</span>
    <span class="vi">@nombres</span><span class="p">.</span><span class="nf">each</span> <span class="k">do</span> <span class="o">|</span><span class="n">nombre</span><span class="o">|</span>
      <span class="nb">puts</span> <span class="s2">"Hola </span><span class="si">#{</span><span class="n">nombre</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">"Hola </span><span class="si">#{</span><span class="vi">@nombres</span><span class="si">}</span><span class="s2">"</span>
  <span class="k">end</span>
<span class="k">end</span></code></pre></figure>

Ahora usa el atributo `@nombres` para tomar decisiones. Si es `nil`, sólo
imprime tres puntos. No hay razón para saludar a nadie, ¿cierto?

## Iterando

Si el objeto `@nombres` responde al método `each`, es algo sobre lo que
se puede iterar, así que iteramos entre sus elementos y saludamos a cada
uno de sus integrantes. Finalmente, si `@nombres` es otra cosa, dejamos
que automáticamente se convierta en un string y usamos el saludo por
defecto.

Veamos ese iterador en más detalle:

<figure class="highlight"><pre><code class="language-ruby" data-lang="ruby"><span class="vi">@nombres</span><span class="p">.</span><span class="nf">each</span> <span class="k">do</span> <span class="o">|</span><span class="n">nombre</span><span class="o">|</span>
  <span class="nb">puts</span> <span class="s2">"Hola </span><span class="si">#{</span><span class="n">nombre</span><span class="si">}</span><span class="s2">"</span>
<span class="k">end</span></code></pre></figure>

El método `each` acepta un bloque de código y lo ejecuta por cada
elemento de la lista, y el código entre `do` y `end` es el bloque en sí
mismo. Un bloque es como una función anónima o `lambda`. La variable
entre los pipes (\|) es el parámetro para este bloque.

Lo que sucede es que por cada elemento en la lista, `nombre` va tomando
su valor y se ejecuta la expresión `puts "Hola #{nombre}"` con ese
nombre.

Muchos otros lenguajes de programación manejan la iteración de una lista
usando la clásica sintaxis `for`, que en C se ve así:

<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">cantidad_de_elementos</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">hacer_algo_con</span><span class="p">(</span><span class="n">elementos</span><span class="p">[</span><span class="n">i</span><span class="p">]);</span>
<span class="p">}</span></code></pre></figure>

Esto funciona, pero no es muy elegante. Necesitas una variable
descartable como `i`, averiguar la cantidad de elementos de la lista, y
explicar cómo recorrerla. La costumbre Ruby (The Ruby Way) es mucho más
elegante, todos los detalles de infraestructura se ocultan en el método
`each`, todo lo que necesitas hacer es decirle qué hacer con cada
elemento. Internamente, el método `each` llamará `yield "Alberto"`,
después `yield "Beatriz"`, después `yield "Carlos"`, y así
sucesivamente.

## Los bloques, una de las funcionalidades más potentes de Ruby

El poder real de los bloques se disfruta al trabajar con cosas más
complicadas que las listas. Más allá de manejar los detalles de
infraestructura dentro del método, también puedes manejar la
inicialización, la finalización, y los errores—todos ocultos y
simplificados frente a las preocupaciones del desarrollador.

<figure class="highlight"><pre><code class="language-ruby" data-lang="ruby"><span class="c1"># Decirle adiós a todos</span>
<span class="k">def</span> <span class="nf">decir_adios</span>
  <span class="k">if</span> <span class="vi">@nombres</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">@nombres</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"># Juntar los elementos de la lista</span>
    <span class="c1"># usando la coma como separador</span>
    <span class="nb">puts</span> <span class="s2">"Adiós </span><span class="si">#{</span><span class="vi">@nombres</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">. Vuelvan pronto."</span>
  <span class="k">else</span>
    <span class="nb">puts</span> <span class="s2">"Adiós </span><span class="si">#{</span><span class="vi">@nombres</span><span class="si">}</span><span class="s2">. Vuelve pronto."</span>
  <span class="k">end</span>
<span class="k">end</span></code></pre></figure>

El método `decir_adios` no usa `each`, en vez de eso se fija si
`@nombres` responde al método `join`, y si es así, lo usa. Si no es así,
simplemente imprime la variable como un string. Esta práctica de no
preocuparse sobre el *tipo* de objeto de una variable, y simplemente
depender de los métodos que esta soporta, es conocida como “Duck
Typing”. El beneficio es que no limita innecesariamente los tipos de
variables que son soportados. Si alguien inventa un nuevo tipo de lista,
siempre y cuando implemente el método `join` con la misma semántica que
otras listas, todo funcionará como fue planeado.

## Arrancando el Script

Así que eso es la clase MegaAnfitrion, el resto del archivo sólo llama a
los métodos de la clase. Hay un último truco para tener en cuenta, y es
la línea:

<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__` es la variable mágica que contiene el nombre del archivo que
se está ejecutando en ese momento. `$0` es el nombre del archivo usado
para iniciar el programa. Esta verificación dice “si este es el archivo
principal…”. Esto permite que un archivo sea utilizado como una
biblioteca, y no ejecutar código en ese contexto. Pero si el archivo
está siendo usado como un ejecutable, entonces ejecuta ese código.

## Considérate iniciado

Eso es todo en este rápido paseo por Ruby. Hay mucho más por explorar,
las estructuras de control diferentes que ofrece Ruby; el uso de los
bloques y `yield`; módulos como mixins; y más. Espero que esta pequeña
muestra de Ruby te despierte el interés por saber más.

Si es así, por favor dirígete a nuestra área de
[Documentación](/es/documentation/), donde encontrarás vínculos a cursos
y manuales, todos disponibles gratuitamente en internet.
