Domanda

Di solito faccio qualcosa del genere

array.sort{|a,b| a.something <=> b.something}

Come dovrei ASCIUGARLO?

È stato utile?

Soluzione

usa sort_by

array.sort_by{|e| e.something}

o

sort_lambda = lambda{|e| e.something}
array.sort_by(&sort_lambda)

Con quest'ultimo puoi riutilizzare sort_lambda in altre istruzioni sort_by

Altri suggerimenti

In Rails, o meglio con ActiveSupport, o in Ruby 1.9 (possibilmente 1.8.7, non sono sicuro) puoi usare il nuovo hotness di scorciatoia:

array.sort_by(&:something)

Nota che sort_by ha effetti collaterali forse costosi (e forse vantaggiosi: dipende dalla complessità della chiave di ordinamento): genera e memorizza una coppia chiave-valore temporanea per ciascun elemento in modo che possa ordinare in base alla nuova chiave. Vedi la nella documentazione per ulteriori informazioni al riguardo.

+1 a entrambi i suggerimenti di Eimantas, ma spesso mi viene in mente nei casi in cui ho una classe personalizzata che sempre ordina in questo modo, come gli album che dovrebbero ordinare senza distinzione tra maiuscole e minuscole, ignorando punteggiatura iniziale e / a / an. A tale scopo è più efficiente calcolare una volta il valore dell'ordinamento, quindi ridefinire & Lt; = & Gt; di conseguenza. Per esempio:.

class Album
 def sort_value
    @sv ||= @name.downcase.sub(/^\W*(the|an|a) /,"")
  end

  def <=>(other)
    sort_value <=> (other.sort_value rescue other)
  end
end

Hai preso in considerazione l'inclusione di Comparable nella classe per aeb, e hai appena chiamato sort?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top