O que é um bloco?
Um bloco é código que você entrega a um método
A maioria das chamadas de método até agora nesta série passou valores simples como argumentos, como access_level("admin", true, false). O merge do curso de hashes recebeu um bloco uma vez, sem explicação. Um bloco é um pequeno pedaço de código sem nome passado para um método, que o método pode rodar, até mais de uma vez.
3.times { puts "hello" }
# hello
# hello
# hello
{ puts "hello" } é o bloco, e times o chama três vezes seguidas. puts "hello" não precisou virar um método com nome antes; o bloco é escrito onde é usado.
Duas sintaxes equivalentes: {} e do...end
3.times { puts "hi" }
3.times do
puts "hi"
end
Chaves e do/end envolvem um bloco do mesmo jeito. A convenção, não uma regra rígida, é {} para um bloco que cabe numa linha e do/end para um que ocupa várias, como nos dois exemplos acima.
Blocos podem receber um valor
[10, 20, 30].each { |n| puts n * 2 }
# 20
# 40
# 60
O |n| entre pipes nomeia uma variável que o bloco recebe cada vez que roda. each chama o bloco uma vez por elemento e entrega esse elemento como n. É a versão de bloco da lista de parâmetros de um método, escrita entre pipes em vez de parênteses.
Por que isso importa: um conceito, em todo lugar
Blocos não são exclusivos de each; o times acima também usou um. O each_with_index deste curso e o map e o select dos próximos cursos se apoiam na mesma ideia: um método recebe um bloco e o roda, entregando o valor que faz sentido para aquele método. Aprender a ler { |n| ... } aqui rende em dezenas de métodos.
Pontos-chave
- Um bloco é código passado para um método, escrito com
{}oudo/end; os dois significam a mesma coisa. - Convenção:
{}para um bloco de uma linha,do/endpara um bloco de várias linhas. |n|nomeia uma variável que o bloco recebe; o método que chama decide o que entregar e quantas vezes rodar o bloco.- Um método chamando o bloco que recebeu é o padrão por trás de
each,times,map,selecte da maioria dos métodos de iteração do Ruby.
Continue com a aula 2
Iterando arrays com each
Mostra como o each roda o bloco por elemento, devolve o array original e permite acumular fora do bloco.
Com uma conta grátis você também tem os quizzes, seu progresso e suas anotações, e a discussão.