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)

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top