Código dobrando em colecionamento consecutivo/selecionar/rejeitar/cada
Pergunta
Eu brinco com matrizes e hashes bastante em Ruby e acabo com algum código que se parece com o seguinte:
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 fingir que a amostra de código acima faz sentido agora ...)
O problema é que, embora o textmate (meu editor de escolha) pegue simples {...}
ou do...end
Blocks com bastante facilidade, ele não consegue descobrir (o que é compreensível, pois nem consigo encontrar uma maneira "correta" de dobrar o acima), onde os blocos acima começam e terminam para dobrá -los.
Como você dobraria o exemplo de código acima?
PS: Considerando que poderia ter 2 níveis de dobra, eu só me preocupo com os consecutivos externos (os blocos com o i)
Solução
Para ser sincero, algo que complicado provavelmente está confundindo o TextMate tanto quanto qualquer outra pessoa que precise mantê -lo, e isso inclui você no futuro.
Sempre que você vê algo que rola em um único valor, é um bom caso para usar o#enumerável.
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
O que é estranho no seu exemplo é que você está usando selecionar retornar a matriz completa, supostamente convertida usando para_i, mas de fato enumerável#select não faz isso e, em vez disso, rejeita qualquer um para o qual a função retorne nulo. Estou presumindo que isso não é de seus valores.
Além disso, dependendo de como o seu método .Average é implementado, convém semear a chamada de injeção com 0,0 em vez de 0 para usar um valor de ponto flutuante.