Nuevo en ruby, ponte tus guantes de novato.
¿Hay alguna diferencia (oscura o práctica) entre los siguientes dos fragmentos?
my_array = [:uno, :dos, :tres]
my_array.each { |item|
puts item
}
my_array = [:uno, :dos, :tres]
my_array.each do |item|
puts item
end
Me doy cuenta de que la sintaxis de llaves te permitiría colocar el bloque en una línea
my_array.each { |item| puts item }
pero fuera de eso, ¿existen razones de peso para usar una sintaxis sobre la otra?
ruby
coding-style
Alan Storm
fuente
fuente
each
funciona con corchetes pero no condo
-end
(ruby) , Definición del bloque - ¿diferencia entre llaves ydo
-end
? , Bloque multilínea de Ruby sindo
end
, ¿Cuál es la diferencia o el valor de estos estilos de codificación de bloque en Ruby? y Ruby block y argumentos sin paréntesis .Respuestas:
El libro de cocina de Ruby dice que la sintaxis de corchetes tiene un orden de precedencia más alto que
do..end
El segundo ejemplo solo funciona cuando se utilizan paréntesis,
1.upto(3) { |x| puts x }
fuente
Esta es una pregunta un poco vieja, pero me gustaría intentar explicar un poco más sobre
{}
ydo .. end
como se dijo antes
pero cómo este hace la diferencia:
en este caso, se llamará al método1 con el bloque de
do..end
y el método2 se pasará al método1 como argumento. que es equivalente amethod1(method2){ puts "hi" }
pero si dices
luego se llamará al método2 con el bloque y luego el valor devuelto se pasará al método1 como argumento. Que es equivalente a
method1(method2 do puts "hi" end)
#### salida ####
fuente
Generalmente, la convención es usar
{}
cuando está haciendo una operación pequeña, por ejemplo, una llamada a un método o una comparación, etc., por lo que esto tiene mucho sentido:Pero si tiene una lógica ligeramente compleja que va a varias líneas, use
do .. end
como:Básicamente, se reduce a, si su lógica de bloque va a varias líneas y no se puede ajustar en la misma línea, entonces use
do .. end
y si su lógica de bloque es simple y solo una línea de código simple / única, entonces use{}
.fuente
result_with_some_condition = method{|c| c.do_something || whateever}; result_with_some_condition.another_method
ya que eso lo hace un poco más comprensible. Pero generalmente evitaría un choque de trenes.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:
{ }
para bloques de una sola líneado end
para bloques de varias líneasEsto 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 usaend
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:
do end
para bloques de procedimiento{ }
para bloques funcionalesEsto 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:
Sin embargo, aquí no se usa el valor de retorno del bloque. Se está operando de procedimiento, y haciendo un efecto secundario con ella:
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.
fuente
Usé el estilo Weirich durante años, pero me alejé de esto para usar siempre aparatos ortopédicos . No recuerdo haber usado nunca la información del estilo de bloque, y la definición es un poco vaga. Por ejemplo:
¿Son procudual o funcional?
Y la cosa del recuento de líneas es inútil en mi opinión. Lo sé, si hay 1 o más líneas, y ¿por qué exactamente debería cambiar el estilo solo porque agregué o eliminé líneas?
fuente