style sintax rails index ruby operators haml

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