ruby - sintax - haml style
Práctica recomendada de Ruby: si no está vacío, haga lo mismo en un operador. (7)
¿Qué pasa?
array.each do |x|
#...
puts "x",x
end.empty? and begin
puts "empty!"
end
1. No puedo encontrar una manera elegante de escribir este código:
if array.empty?
# process empty array
else
array.each do |el|
# process el
end
end
Me gustaría tener un bucle, sin escribir array
dos veces. Leí this , pero no hay una solución lo suficientemente buena.
2. En realidad estoy en una plantilla HAML. La misma pregunta.
- if array.empty?
%p No result
- else
%ul
- array.each do |el|
%li el
Creo que no hay una forma mucho más elegante o legible de escribir esto. Cualquier forma de combinar de alguna manera una iteración con una condición solo resultará en un código de caja negra, lo que significa que es muy probable que la condición esté oculta en una extensión de Array
.
La forma más limpia que he visto hacer esto en HAML (no es Ruby) es algo como:
- array.each do |item|
%li
= item.name
- if array.empty?
%li.empty
Nothing here.
Como se mencionó en otras respuestas, no hay necesidad de la cláusula else
porque eso ya está implícito en la otra lógica.
Incluso si pudieras hacer el otro en una línea limpia, no podrías lograr el marcado que intentas lograr ( <p>
si array.empty ?, <ul>
if array.present?). Además, el HAML que muestra en su pregunta es la mejor manera de contar la historia detrás de su código, lo que significa que será más legible y mantenible para otros desarrolladores, así que no sé por qué querría refactorizarlo en algo más críptico. .
Si la array
está vacía, entonces no se iterará, por lo que no es necesario condicionar each
bloque. Dado que el valor de retorno de each
es el receptor, puede colocar each
bloque dentro del empty?
condición.
if (array.each do |el|
# process el
end).empty?
# process empty array
end
Si la matriz es nula, podemos aplicar la matriz vacía
if (array || []).each do |x|
#...
puts "x",x
end.empty?
puts "empty!"
end
Suponiendo que la "matriz vacía del proceso" la deje vacía después del procesamiento, puede omitir el resto:
if array.empty?
# process empty array
end
array.each do |el|
# process el
end
o en una línea:
array.empty? ? process_empty_array : array.each { |el| process_el }
Vi a algunas personas preguntando cómo manejar esto para casos nulos.
El truco es convertirlo en cadena. Todos los nils convertidos en cadena se convierten en una cadena vacía, todos los casos vacíos siguen estando vacíos.
nil.to_s.empty?
"".to_s.empty?
ambos volverán verdad