Hay dos estilos comunes para elegir do end
vs. { }
para bloques en Ruby:
El primer y muy común estilo fue popularizado por Ruby on Rails, y se basa en una regla simple de una o varias líneas:
- Use tirantes
{ }
para bloques de una sola línea
- Utilizar
do end
para bloques de varias líneas
Esto tiene sentido porque do / end se lee mal en una sola línea, pero para bloques de varias líneas, dejar un cierre }
colgando en su propia línea es inconsistente con todo lo demás que se usa end
en ruby, como las definiciones de módulo, clase y método ( def
etc. .) y las estructuras de control ( if
, while
, case
, etc.)
El segundo estilo, menos visto, se conoce como semántico, o " Weirich Braces ", propuesto por el difunto gran rubyista Jim Weirich:
- Usar
do end
para bloques de procedimiento
- Use tirantes
{ }
para bloques funcionales
Esto significa que cuando el bloque se evalúa por su valor de retorno , debe ser encadenable y las {}
llaves tienen más sentido para el encadenamiento de métodos.
Por otro lado, cuando el bloque se evalúa por sus efectos secundarios , entonces el valor de retorno no tiene importancia y el bloque simplemente está "haciendo" algo, por lo que no tiene sentido estar encadenado.
Esta distinción en la sintaxis transmite un significado visual sobre la evaluación del bloque y si debe o no preocuparse por su valor de retorno.
Por ejemplo, aquí el valor de retorno del bloque se aplica a cada elemento:
items.map { |i| i.upcase }
Sin embargo, aquí no se usa el valor de retorno del bloque. Se está operando de procedimiento, y haciendo un efecto secundario con ella:
items.each do |item|
puts item
end
Otro beneficio del estilo semántico es que no es necesario cambiar las llaves para hacer / terminar solo porque se agregó una línea al bloque.
Como observación, casualmente los bloques funcionales son frecuentemente de una sola línea, y los bloques de procedimiento (por ejemplo, config) son de múltiples líneas. Entonces, seguir el estilo Weirich termina luciendo casi igual que el estilo Rails.