Hoje vamos continuar falando de Ruby, é hora de nos aprofundar falando um pouco de `Objetos Enumeráveis`... Estranho para alguns, mas, veremos que é simples!
Objetos Enumeráveis
Array
, Range
, Hash
, e um número de outras classes definem um iterador each
que passa cada elemento da
coleção para o bloco associado. Este é talvez o mais comumente usado iterador em Ruby, o loop só funciona para
iterar sobre objetos que têm o método each
. Exemplos de iteradores each
:
1 2 |
|
O iterador each
não é só para as classes tradicionais “de estrutura de dados”. Classes IO
Ruby definem um
iterador each
que cada linha de texto lido do objeto produz Input/Output
. Assim, você pode processar as linhas
de um arquivo em Ruby com um código como esse:
1 2 3 |
|
A maioria das classes que definem um método each
também incluem o módulo Enumerable
, que define um número de
iteradores mais especializados que são implementados em cima do método each
. Um iterador é útil tal each_with_index
, o que nos permite adicionar a linha de numeração para o exemplo anterior:
1 2 3 4 5 |
|
Alguns dos iteradores mais comumentes utilizados são os métodos Enumerable
, collect
, select
, reject
, e
inject
. O método collect
(também conhecido como map
) executa o seu bloco associado para cada elemento do objeto
enumerável, e coleta os valores de retorno dos blocos em um array
:
1
|
|
O método select
invoca o bloco associado para cada elemento no objeto enumerável, e retorna uma matriz de
elementos para a qual o bloco retorna um outro valor false
ou nil
. Por exemplo:
1
|
|
O método reject
é simplesmente o oposto de select
, ele retorna uma matriz de elementos para a qual o bloco
retorna nil
ou false
. Por exemplo:
1
|
|
O método inject
é um pouco mais complicado do que os outros. Ele invoca o bloco associado com dois argumentos.
O primeiro argumento é um valor acumulado de algum tipo das iterações anteriores. O segundo argumento é o próximo
o objeto enumerável. O valor de retorno do bloco é o primeiro argumento bloqueado para a próxima iteração, ou torna-
se o valor de retorno do iterador após a última iteração. O valor inicial da variável acumula ou é o argumento de
inject
, se houver um, ou o primeiro elemento do objeto enumerável. (Neste caso, o bloco é invocado. Apenas uma vez durante os primeiros dois elementos). Exemplos para injects
mais claros:
1 2 3 4 |
|
Veja Objetos Enumeráveis para obter mais detalhes sobre o Módulo Enumerable
e a seus iteradores.
Até a proxima amigos…