Question

Je joue avec des tableaux et hachages beaucoup en rubis et finissent avec un code qui ressemble à ceci:

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

(Nous allons tous faire semblant que l'échantillon de code ci-dessus est maintenant logique ...)

Le problème est que même si TextMate (mon éditeur de choix) prend assez facilement de simples blocs de {...} ou do...end, il ne peut pas comprendre (ce qui est compréhensible car même je ne peux pas trouver un moyen « correcte » à plier ci-dessus) où les blocs ci-dessus commencent et se terminent à les plier.

Comment plier l'exemple de code ci-dessus?

PS: étant donné que cela pourrait avoir 2 niveaux de pliage, je ne se soucient que ceux consécutifs extérieures (les blocs avec le i)

Était-ce utile?

La solution

Pour être honnête, ce qui, autant que quelqu'un d'autre TextMate alambiqué est source de confusion probablement qui doit le maintenir, et que vous inclut dans l'avenir.

Chaque fois que vous voyez quelque chose qui roule en une seule valeur, il est un bon cas pour l'utilisation inject Enumerable de #.

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

Ce qui est étrange dans votre exemple est que vous utilisez le produit retourne le tableau complet, aurait été converti en utilisant to_i, mais en fait Enumerable # select ne pas une telle chose, et rejette toute la place pour laquelle la fonction retourne zéro. Je présume que c'est pas de vos valeurs.

En outre, selon la façon dont votre méthode .Moyenne est mis en œuvre, vous pouvez semer l'appel inject avec 0,0 au lieu de 0 à utiliser une valeur à virgule flottante.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top