Há dois estilos comuns para a escolha do end
vs. { }
para blocos em Ruby:
O primeiro e muito comum estilo foi popularizado por Ruby on Rails e é baseado em uma regra simples de linha única vs. multilinha:
- Use colchetes
{ }
para blocos de linha única
- Use
do end
para blocos multilinhas
Isso faz sentido porque do / end lê mal em uma linha, mas para blocos de várias linhas, deixar um fechamento }
pendurado em sua própria linha é inconsistente com tudo o mais que usa end
em ruby, como módulo, definição de classe e método ( def
etc .) e estruturas de controlo ( if
, while
, case
, etc.)
O segundo estilo, visto com menos frequência, é conhecido como semântico, ou " Chaves Weirich ", proposto pelo falecido grande rubista Jim Weirich:
- Use
do end
para bloqueios procedurais
- Use chaves
{ }
para blocos funcionais
Isso significa que quando o bloco é avaliado por seu valor de retorno , ele deve ser encadeado e as {}
chaves fazem mais sentido para o encadeamento de métodos.
Por outro lado, quando o bloco é avaliado quanto aos seus efeitos colaterais , o valor de retorno não tem importância, e o bloco está apenas "fazendo" alguma coisa, então não faz sentido ser encadeado.
Esta distinção na sintaxe transmite um significado visual sobre a avaliação do bloco e se você deve ou não se preocupar com seu valor de retorno.
Por exemplo, aqui o valor de retorno do bloco é aplicado a todos os itens:
items.map { |i| i.upcase }
No entanto, aqui não está usando o valor de retorno do bloco. Está operando de maneira processual e causando um efeito colateral com isso:
items.each do |item|
puts item
end
Outro benefício do estilo semântico é que você não precisa alterar os colchetes para fazer / terminar apenas porque uma linha foi adicionada ao bloco.
Como observação, os blocos funcionais coincidentemente são frequentemente de uma linha e os blocos de procedimento (por exemplo, configuração) são multilinhas. Então, seguir o estilo Weirich acaba ficando quase igual ao estilo Rails.