Skip to content

Instantly share code, notes, and snippets.

@filipechagas
Created December 16, 2009 23:43
Show Gist options
  • Save filipechagas/258348 to your computer and use it in GitHub Desktop.
Save filipechagas/258348 to your computer and use it in GitHub Desktop.
fonte: http://www.akitaonrails.com/2008/11/10/micro-tutorial-de-ruby-parte-ii
contents = File.open(aFile).readlines.inject("") do |buf, line|
buf += line
end
O método ‘readlines’ devolve um Array, onde cada elemento é uma linha do arquivo texto. O método “inject” é um Redutor: ele pega linha a linha do Array e repassa ao bloco, como primeiro parâmetro. O segundo parâmetro, ‘buf’, é um totalizador que é iniciado com o primeiro parâmetro que passamos no método ‘inject’, no caso a string vazia “". Ele repassa sempre esse objeto como segundo parâmetro do bloco. Dentro do bloco podemos fazer o que quiser, mas normalmente queremos que seja um totalizador por isso usamos o operador "+=” que significa “buf = buf + line”.
Em Ruby é muito comum utilizar essa maneira de pensar: em vez de pensar em “como vamos iterar elemento a elemento”, partimos do princípio que isso é trivial e daí pensamos “como queremos filtrar elemento a elemento”. Linhas como a seguinte são bastante comuns:
>> [1,2,3,4,5].map { |elem| elem * elem }
=> [1, 4, 9, 16, 25]
>> [1,2,3,4,5].select { |elem| elem % 2 == 0 }
=> [2, 4]
>> [1,2,3,4,5].inject(0) { |total, elem| total += elem }
=> 15
>> total = 0
=> 0
>> [1,2,3,4,5].each { |elem| total += elem }
=> [1, 2, 3, 4, 5]
>> total
=> 15
O primeiro exemplo – “map” – substitui elemento a elemento pelo resultado do bloco. O segundo – “select” – devolve o resultado do filtro que é passado como bloco. O terceiro – “inject” – é o redutor que já vimos acima e o quarto – “each” – é a mesma coisa que o “inject” mas menos encapsulado e usando código extra para chegar ao mesmo efeito.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment