Plegado de código en consecutiva a cobro revertido / select / rechazar / cada uno

StackOverflow https://stackoverflow.com/questions/1757181

  •  20-09-2019
  •  | 
  •  

Pregunta

Juego alrededor con arrays y hashes a ser determinante en rubí y termino con un código que se parece a esto:

sum = two_dimensional_array.select{|i|
  i.collect{|j|
    j.to_i
  }.sum > 5
}.collect{|i|
  i.collect{|j|
    j ** 2
  }.average
}.sum

(Vamos todos a suponer que el ejemplo de código anterior tiene sentido ahora ...)

El problema es que a pesar de que TextMate (mi editor de elección) recoge bloques {...} o do...end simples con bastante facilidad, no se puede averiguar (lo cual es comprensible, ya que ni siquiera yo puedo encontrar una manera "correcta" de plegar lo anterior) donde los bloques anteriores empiezan y terminan a veces ellos.

¿Cómo plegar el ejemplo de código anterior?

PS: teniendo en cuenta que podría tener 2 niveles de plegado, que sólo se preocupan por los consecutivos exteriores (los bloques con el i)

¿Fue útil?

Solución

Para ser honesto, algo que es, probablemente, confundiendo enrevesado TextMate tanto como cualquier otra persona que tiene que mantener, y que incluye en el futuro.

Siempre que vea algo que se enrolla en un solo valor, que es un buen caso para usar Enumerable # inyección.

sum = two_dimensional_array.inject(0) do |sum, row|
  # Convert row to Fixnum equivalent
  row_i = row.collect { |i| i.to_i }

  if (row_i.sum > 5)
    sum += row_i.collect { |i| i ** 2 }.average
  end

  sum # Carry through to next inject call
end

Lo extraño en su ejemplo es que estés usando seleccione para devolver la matriz completa, supuestamente convertidos usando to_i, pero en realidad enumerables # seleccionar no hace tal cosa, y en su lugar rechaza toda para los que la función devuelve nil. Estoy suponiendo que no es de sus valores.

También en función de cómo se implementa el método de .average, es posible que desee sembrar la llamada inyección con 0.0 en lugar de 0 a utilizar un valor de coma flotante.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top