Created
December 16, 2009 23:43
-
-
Save filipechagas/258348 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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